C# 选择下一个同级的Xpath

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>

我有一段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>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值1
Label2值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 ) ]