用于选择下一个兄弟的Xpath

Ula*_*kar 20 c# xml xpath

我有这样的HTML片段:

<dt>name</dt>
<dd>value</dd>
<dt>name2</dt>
<dd>value2</dd>

我想找到结构不正确的所有地方,这意味着dd标签后没有dt标签.

我试过这个:

//dt/following-sibling::dt

但这不起作用.有什么建议?

Aak*_*shM 16

编辑 @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();
Run Code Online (Sandbox Code Playgroud)

输出是那些dt没有dd紧跟其后的节点:

<dt>name2</dt>
<dt>name4</dt>
<dt>name6</dt>
Run Code Online (Sandbox Code Playgroud)

我们在这里做的是说:

//dt
Run Code Online (Sandbox Code Playgroud)

所有dt节点,任何地方....

[not(following-sibling::*[1]
Run Code Online (Sandbox Code Playgroud)

....这不是他们的第一个兄弟(无论它叫什么)的情况......

[self::dd]]
Run Code Online (Sandbox Code Playgroud)

......被称为dd.

  • @Tomalak你的XPath不符合所有情况,看看我的答案,你只匹配第一个. (2认同)

Gai*_*aim 16

我不确定我理解你,但有我的解决方案.此XPath匹配所有<dt><dd>直接跟随的ALL .所以有测试结构

<xml>
  <dt>name</dt> <!-- match -->

  <dt>name2</dt>
  <dd>value2</dd>

  <dt>name</dt>
  <dd>value</dd>

  <dt>name2</dt>  <!-- match -->
</xml>
Run Code Online (Sandbox Code Playgroud)

有XPath

//dt[ name( following-sibling::*[1] ) != 'dd' ]
Run Code Online (Sandbox Code Playgroud)

要么

//dt[  not( following-sibling::*[1]/self::dd ) ]
Run Code Online (Sandbox Code Playgroud)

他们做同样的事情