用于选择下一个兄弟的Xpath

时间:2010-01-19 09:08:04

标签: c# xml xpath

我有这样的HTML:

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

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

我试过了:

//dt/following-sibling::dt

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

2 个答案:

答案 0 :(得分: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();

输出是那些紧随其后没有dt的{​​{1}}个节点:

dd

我们在这里做的是说:

<dt>name2</dt>
<dt>name4</dt>
<dt>name6</dt>

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

dt

....这样,他们的第一个跟随兄弟(不管它叫什么)的情况...... ....

[not(following-sibling::*[1]

...被称为[self::dd]]

答案 1 :(得分:16)

我不确定我是否了解你,但有我的解决方案。此XPath匹配所有<dt>,而<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' ]

有XPath

//dt[  not( following-sibling::*[1]/self::dd ) ]

{{1}}

他们做同样的事情