XPath - Wählen Sie den Text der ausgewählten untergeordneten Knoten aus

html-agility-pack xpath

Frage

Vorausgesetzt, ich habe ein folgendes 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>

Gibt es "einen XPath" , der mir hilft, den inneren Text von div # Main als einen einzelnen Knoten auszuwählen, aber die Texte jedes div.quote ausschließen muss.

Ich will nur den Text: "Das ist Inhalt. Das ist auch Inhalt und ich will beide"

Danke im Voraus

Hier ist der Code zum Testen des XPath, ich benutze .NET mit HtmlAgilityPack, aber ich glaube, dass der xPath mit allen Sprachen funktionieren sollte

[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);
}

Der Test ist offensichtlich fehlgeschlagen, weil der xPath immer noch nicht korrekt ist.

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."

Akzeptierte Antwort

Ich glaube nicht, dass es einen XPath gibt, der Ihnen dies als einen einzelnen Knoten gibt, weil die Werte, die Sie erhalten wollen, kein einzelner Knoten sind. Gibt es einen Grund, warum du das nicht tun kannst?

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());

Beliebte Antwort

Sie möchten den Text jedes Kindes des Div, das nicht div mit Klasse ist Zitat:

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


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow