web-dev-qa-db-ja.com

次の兄弟を選択するためのXpath

私はこのようなHTMLを持っています:

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

構造が正しくないすべての場所を見つけたい、つまりddタグの後にdtタグがない。

私はこれを試しました:

 // dt/follow-sibling :: dt 

しかし、これは機能しません。助言がありますか?

20
Ula Krukar

[〜#〜] 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と呼ばれます。

16
AakashM

私はあなたを理解しているかどうかはわかりませんが、私の解決策はあります。この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 ) ]

彼らは同じことをします

16
Gaim