XPath:如何获取两个兄弟节点的连接文本?
XPath : How to get concatenated text of two sibling nodes?
我想知道如何获取两个兄弟节点的连接文本。
这是我的代码。
string html =
"<html>" +
" <div class='abc'>" +
" <h3><a href='def'>ghi</a></h3>" +
" <div>text1</div>" +
" <div>text2</div>" +
" </div>" +
" <div class='abc'>" +
" <h3><a href='jkl'>mno</a></h3>" +
" <div>text3</div>" +
" <div>text4</div>" +
" </div>" +
"</html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class='abc']");
HtmlNodeCollection nodes2, nodes3;
foreach (HtmlNode node in nodes)
{
nodes2 = node.SelectNodes(".//h3/a");
nodes3 = node.SelectNodes("?????????????");
}
我要得到结果
text1text2
然后
text3text4
如何编写查询替换问号?我知道我可以通过使用 foreach 遍历节点来获取文本。但我必须使用 XPath 查询来做到这一点。
谢谢。
我不确定我是否理解,但考虑到外部 div
元素是您的上下文,以下表达式:
concat(div[1],div[2])
将 return 第一个和第二个子 div
元素的字符串值的串联。
顺便说一下,h3
是 /html/div
的直接子代,所以在这个表达式中不需要使用 //
:
nodes2 = node.SelectNodes(".//h3/a");
您可能希望将其减少到
nodes2 = node.SelectNodes("h3/a");
concat(//div[@class='abc'][1]/div[1]/text(), //div[@class='abc'][1]/div[2]/text())
应该给:text1text2
concat(//div[@class='abc'][2]/div[1]/text(), //div[@class='abc'][2]/div[2]/text())
应该给text3text4
这应该适用于 htmlagilitypack 中使用的 XPATH 1.0。
@Mathias Müller 的评论就是答案。
SelectNodes returns 节点列表,我们必须使用 C# 编程浏览集合节点。
错误是我在等待文本结果。
我想知道如何获取两个兄弟节点的连接文本。
这是我的代码。
string html =
"<html>" +
" <div class='abc'>" +
" <h3><a href='def'>ghi</a></h3>" +
" <div>text1</div>" +
" <div>text2</div>" +
" </div>" +
" <div class='abc'>" +
" <h3><a href='jkl'>mno</a></h3>" +
" <div>text3</div>" +
" <div>text4</div>" +
" </div>" +
"</html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class='abc']");
HtmlNodeCollection nodes2, nodes3;
foreach (HtmlNode node in nodes)
{
nodes2 = node.SelectNodes(".//h3/a");
nodes3 = node.SelectNodes("?????????????");
}
我要得到结果
text1text2
然后
text3text4
如何编写查询替换问号?我知道我可以通过使用 foreach 遍历节点来获取文本。但我必须使用 XPath 查询来做到这一点。
谢谢。
我不确定我是否理解,但考虑到外部 div
元素是您的上下文,以下表达式:
concat(div[1],div[2])
将 return 第一个和第二个子 div
元素的字符串值的串联。
顺便说一下,h3
是 /html/div
的直接子代,所以在这个表达式中不需要使用 //
:
nodes2 = node.SelectNodes(".//h3/a");
您可能希望将其减少到
nodes2 = node.SelectNodes("h3/a");
concat(//div[@class='abc'][1]/div[1]/text(), //div[@class='abc'][1]/div[2]/text())
应该给:text1text2
concat(//div[@class='abc'][2]/div[1]/text(), //div[@class='abc'][2]/div[2]/text())
应该给text3text4
这应该适用于 htmlagilitypack 中使用的 XPATH 1.0。
@Mathias Müller 的评论就是答案。
SelectNodes returns 节点列表,我们必须使用 C# 编程浏览集合节点。
错误是我在等待文本结果。