0

私が次の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>

div#Mainの内部テキストを単一ノードとして選択するのに役立つ「XPath」はありますが、 div.quoteのテキストを除外する必要があります。

「これはコンテンツです。これもコンテンツであり、両方が必要です」というテキストが必要です。

前もって感謝します

XPathをテストするためのコードは次のとおりです。HtmlAgilityPackで.NETを使用していますが、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."
4

3 に答える 3

2

取得しようとしている値は単一ノードではないため、これを単一ノードとして提供する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());
于 2013-01-31T10:55:29.047 に答える
0

クラス引用符付きのdivではないdivの子のテキストが必要です。

div/*[not(self::div and @class="quote")]/text()
于 2013-01-30T21:46:16.773 に答える
0

XPathはノードオブジェクトを選択し、テキストノードであってもノードオブジェクトのみを選択するため、結合された文字列値を提供するXPathはありません。

<p>問題のノードがあるので、<div>私は使用します

div[@id='Main']/p/text()

<p>これは、の要素内のテキストノードのリストを生成します<div id="Main">。これらを繰り返し、テキストコンテンツを連結するのは簡単なはずです。

于 2019-04-27T18:42:10.183 に答える