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."
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());
Es gibt keinen XPath, der einen kombinierten Zeichenfolgenwert ergibt, da XPath Knotenobjekte und nur Knotenobjekte auswählt, auch wenn es sich um Textknoten handelt.
Angenommen, Sie haben <p>
Knoten in dem fraglichen <div>
, würde ich verwenden
div[@id='Main']/p/text()
Dies erzeugt eine Liste von Textknoten in <p>
Elementen in einem <div id="Main">
. Das Durchlaufen und Verketten von Textinhalten sollte einfach sein.