私はこのようなHTMLを持っています:
<dt> name </ dt> <dd> value </ dd> <dt> name2 </ dt> <dd> value2 </ dd>
構造が正しくないすべての場所を見つけたい、つまりdd
タグの後にdt
タグがない。
私はこれを試しました:
// dt/follow-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();
出力は、直後にdt
がないdd
ノードです。
<dt>name2</dt>
<dt>name4</dt>
<dt>name6</dt>
ここで行っていることは次のとおりです。
//dt
すべてのdt
ノード、どこでも..。
[not(following-sibling::*[1]
....それはnotではないように(それが呼ばれるものは何でも)彼らの最初の次の兄弟の場合...
[self::dd]]
...はdd
と呼ばれます。
私はあなたを理解しているかどうかはわかりませんが、私の解決策はあります。この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>
XPathがあります
//dt[ name( following-sibling::*[1] ) != 'dd' ]
または
//dt[ not( following-sibling::*[1]/self::dd ) ]
彼らは同じことをします