C# 选择下一个同级的Xpath
我有一段HTML,如下所示: <dt>name</dt> <dd>value</dd> <dt>name2</dt> <dd>value2</dd>C# 选择下一个同级的Xpath,c#,xml,xpath,C#,Xml,Xpath,我有一段HTML,如下所示: <dt>name</dt> <dd>value</dd> <dt>name2</dt> <dd>value2</dd> 但这不起作用。有什么建议吗?编辑正如@Gaim所指出的,我的原始版本未能捕获终端dt string xml = @" <root> <dt>name</dt> <dd>value</dd> <dt>
但这不起作用。有什么建议吗?编辑正如@Gaim所指出的,我的原始版本未能捕获终端
dt
string xml = @"
<root>
<dt>name</dt>
<dd>value</dd>
<dt>name2</dt>
<dt>name3</dt>
<dd>value3</dd>
<dt>name4</dt>
<dt>name5</dt>
<dd>value5</dd>
<dt>name6</dt>
</root>
";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNodeList nodes =
doc.SelectNodes("//dt[not(following-sibling::*[1][self::dd])]");
foreach (XmlNode node in nodes)
{
Console.WriteLine(node.OuterXml);
}
Console.ReadLine();
我们在这里所做的是说:
//dt
所有dt
节点,任何位置
[not(following-sibling::*[1]
……这样一来,他们的第一个跟随兄弟姐妹(不管叫什么)就不是
…被称为
dd
我不确定我是否理解您的意思,但有我的解决方案。此XPath匹配所有不直接后跟
的
。所以有测试结构
<xml>
<dt>name</dt> <!-- match -->
<dt>name2</dt>
<dd>value2</dd>
<dt>name</dt>
<dd>value</dd>
<dt>name2</dt> <!-- match -->
</xml>
或
他们做同样的事情+1--XPath表达式可以分解为
//dt[以下兄弟::*[1][self::dt]]
@Tomalak您的XPath并不匹配所有情况,请看我的答案,您只匹配第一个。@Gaim:您是对的。not()
方法是正确的,我没有考虑
是最后一个兄弟姐妹的情况。是否知道如何处理缺失的情况,例如label1值1Label2值2
?请看我的新问题+1,它比我的原始问题要好,因为我的原始问题未能捕获到缺少dt的终端dd
[not(following-sibling::*[1]
[self::dd]]
<xml>
<dt>name</dt> <!-- match -->
<dt>name2</dt>
<dd>value2</dd>
<dt>name</dt>
<dd>value</dd>
<dt>name2</dt> <!-- match -->
</xml>
//dt[ name( following-sibling::*[1] ) != 'dd' ]
//dt[ not( following-sibling::*[1]/self::dd ) ]