2010-01-19 13 views
20

böyle HTML parça var:XPath sonraki kardeş seçtiğiniz için

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

Ben yapı yanlıştır tüm yerleri bulmak istiyorsanız, dt etiketinden sonra hiçbir dd etiketi yoktur anlamına gelir.

 
//dt/following-sibling::dt 

ama bu işe yaramazsa:

Bu çalıştı. Baska öneri? @Gaim tarafından belirtildiği gibi

cevap

16

DÜZENLEME, benim orijinal versiyonu hemen onları takip eden bir dd yok 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(); 

Çıktı olanlar dt düğümleri olan bir terminali yakalamak için başarısız oldu:

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

Burada ne yapıyoruz diyor:

//dt 
0 o değil ilk şu kardeş (her ne denir) durum öyle ki her yerde

Tüm dt düğümler ....

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

.... ....

[self::dd]] 

... dd olarak adlandırılır.

+0

1 - XPath ifadesi aşağı erimiş olabilir '// dt [aşağıdaki kardeşler :: * [1] [self :: dt]]' – Tomalak

+2

@Tomalak XPath'ınız tüm vakalarla eşleşmiyor, cevabıma bakın, sadece ilk atch. – Gaim

+0

@Gaim: Haklısınız. '' Değil() 'yaklaşımı doğru olanıdır, '

''ün son kardeş olduğu durum hakkında düşünmedim. – Tomalak

16

Seni anladığımdan emin değilim ama benim çözümüm var. Bu XPath, TÜMÜ ile eşleşir; bunlar daha sonra <dd> tarafından takip edilmez. Yani XPath yoktur testi yapısı

<xml> 
    <dt>name</dt> <!-- match --> 

    <dt>name2</dt> 
    <dd>value2</dd> 

    <dt>name</dt> 
    <dd>value</dd> 

    <dt>name2</dt> <!-- match --> 
</xml> 

yoktur

//dt[ name(following-sibling::*[1]) != 'dd' ] 

veya

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

onlar aynı şeyi yapmak

+0

+1 adresinde bakın benim dd-eksik dt bir terminal yakalamak için başarısız benim orijinal, daha iyi – AakashM