XPath - выбор текста выбранных дочерних узлов

html-agility-pack xpath

Вопрос

Учитывая, что у меня есть следующий xml:

<div id="Main">
    <div class="quote">
        This is a quote and I don't want this text
    </div> 
    <p>
        This is content.
    </p>
    <p>  
        This is also content and I want both of them
    </p>
</div>

Есть ли «XPath», чтобы помочь мне выбрать внутренний текст div # Main как единственный узел , но должен исключать тексты любого div.quote .

Я просто хочу текст: «Это контент. Это тоже контент, и я хочу, чтобы они оба»

заранее спасибо

Вот код для проверки XPath, я использую .NET с HtmlAgilityPack, но я считаю, что xPath должен работать с любыми языками

[Test]
public void TestSelectNode()
{
    // Arrange 
    var html = "<div id=\"Main\"><div class=\"quote\">This is a quote and I don't want this text</div><p>This is content.</p><p>This is also content and I want both of them</p></div>";
    var xPath = "//div/*[not(self::div and @class=\"quote\")]/text()";

    var doc = new HtmlDocument();
    doc.LoadHtml(html);

    // Action
    var node = doc.DocumentNode.SelectSingleNode(xPath);

    // Assert
    Assert.AreEqual("This is content.This is also content and I want both of them", node.InnerText);
}

Тест прошел неудачно, потому что xPath все еще не корректен.

Test 'XPathExperiments/TestSelectNode' failed:
    Expected values to be equal.

    Expected Value : "This is content.This is also content and I want both of them"
    Actual Value   : "This is content."

Принятый ответ

Я не думаю, что есть XPath, который даст вам это как единственный узел, потому что значения, которые вы пытаетесь получить , не являются одним узлом. Есть ли причина, по которой вы не можете этого сделать?

StringBuilder sb = new StringBuilder();
// Action
var nodes = doc.DocumentNode.SelectNodes(xPath);
foreach(var node in nodes)
{
   sb.Append(node.InnerText);
}

// Assert
Assert.AreEqual("This is content.This is also content and I want both of them", 
                sb.ToString());

Популярные ответы

Вам нужен текст любого дочернего элемента div, который не является div с цитатой класса:

div/*[not(self::div and @class="quote")]/text()


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow