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>

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

수락 된 답변

난 당신이 얻을하려는 값이 단일 노드하지 않기 때문에, 하나의 노드로 당신이 줄 것이다하는 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