【发布时间】:2010-01-19 09:08:03
【问题描述】:
我有一段这样的 HTML:
我想找出所有结构不正确的地方,即dt标签后面没有dd标签。
我试过这个:
//dt/following-sibling::dt但这不起作用。有什么建议吗?
【问题讨论】:
我有一段这样的 HTML:
我想找出所有结构不正确的地方,即dt标签后面没有dd标签。
我试过这个:
//dt/following-sibling::dt但这不起作用。有什么建议吗?
【问题讨论】:
EDIT 如@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();
输出是那些没有dd 紧跟其后的dt 节点:
<dt>name2</dt>
<dt>name4</dt>
<dt>name6</dt>
我们在这里做的是说:
//dt
所有dt 节点,任何地方......
[not(following-sibling::*[1]
....这样不是他们的第一个后续兄弟姐妹(不管它叫什么)....
[self::dd]]
...被称为dd。
【讨论】:
//dt[following-sibling::*[1][self::dt]]
not() 方法是正确的,我没有想到 <dt> 是最后一个兄弟的情况。
我不确定我是否理解你,但我有我的解决方案。此 XPath 匹配 ALL <dt> 后面没有直接跟 <dd>。所以有测试结构
<xml>
<dt>name</dt> <!-- match -->
<dt>name2</dt>
<dd>value2</dd>
<dt>name</dt>
<dd>value</dd>
<dt>name2</dt> <!-- match -->
</xml>
有XPath
//dt[ name( following-sibling::*[1] ) != 'dd' ]
或
//dt[ not( following-sibling::*[1]/self::dd ) ]
他们做同样的事情
【讨论】: