我有这样的HTML:
<dt>name</dt> <dd>value</dd> <dt>name2</dt> <dd>value2</dd>
我想找到结构不正确的所有地方,这意味着dd
标记后没有dt
标记。
我试过了:
//dt/following-sibling::dt
但这不起作用。有什么建议吗?
答案 0 :(得分:16)
编辑,我的原始版本无法捕获终端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}}
他们做同样的事情