2012-04-13 321 views
1

我有一個沒有一致結構的XML。我需要查看是否有一種簡單的方法來搜索所有具有至少一個屬性爲modified =「yes」的子節點的父節點。有沒有簡單的方法來做到這一點與XPath?我將要處理的XML非常龐大,我將使用不具備Visual Studio所有功能的4GL語言,但它確實提供了一些COM對象來幫助瀏覽XML DOM。代碼看起來非常相似,我會在Visual Studio做(見示例XML下面)XPath獲取具有任何具有特定屬性的子節點的所有父節點

示例XML(爲了便於可讀性大大簡化):

<RootNode> 
    <BOOK> 
     <PRICE modified="yes">15</PRICE> 
     <COPIES>10</COPIES> 
    </BOOK> 
    <MAGAZINE> 
     <PRICE>8</PRICE> 
     <COPIES modified="yes">100</COPIES> 
    </MAGAZINE> 
    <NEWSPAPER modified="yes"> 
     <PRICE>2</PRICE> 
     <COPIES>75</COPIES> 
    </NEWSPAPER> 
    <KINDLE_SUB> 
     <PRICE modified="yes">6</PRICE> 
     <COPIES/> 
    </KINDLE_SUB> 
    <EMAIL_SUB> 
     <UNSUBSCRIBE modified="yes">1</UNSUBSCRIBE> 
    </EMAIL_SUB> 
</RootNode> 

在Visual Studio中,你可以做:

XmlDocument xmldoc = new XmlDocument(); 
xmldoc.LoadXml([above xml]); 

XmlNodeList nodelist = xmldoc.SelectNodes(" *XPATH HERE* "); 

應該有希望返回到我:XmlNodeList對象中的BOOK,MAGAZINE,KINDLE_SUB和EMAIL_SUB節點。

不應選擇NEWSPAPER節點,因爲它沒有具有modified =「yes」屬性的子節點,即使該NEWSPAPER節點本身具有此屬性。

回答

1

嘗試:

//*[descendant::*[@modified='yes']] 

或更精確地:

/*/*[descendant::*[@modified='yes']] 

EDIT:什麼將與上述的XPath和修改示例XML返回爲例。

XML

<RootNode> 
    <BOOK> 
    <PRICE modified="yes">15</PRICE> 
    <COPIES>10</COPIES> 
    </BOOK> 
    <foo> 
    <bar> 
     <baz> 
     <yabba> 
      <dabba> 
      <doo modified="yes"/> 
      </dabba> 
     </yabba> 
     </baz> 
    </bar> 
    </foo> 
    <MAGAZINE> 
    <PRICE>8</PRICE> 
    <COPIES modified="yes">100</COPIES> 
    </MAGAZINE> 
    <NEWSPAPER modified="yes"> 
    <PRICE>2</PRICE> 
    <COPIES>75</COPIES> 
    </NEWSPAPER> 
    <KINDLE_SUB> 
    <PRICE modified="yes">6</PRICE> 
    <COPIES/> 
    </KINDLE_SUB> 
    <EMAIL_SUB> 
    <UNSUBSCRIBE modified="yes">1</UNSUBSCRIBE> 
    </EMAIL_SUB> 
</RootNode> 

//*[descendant::*[@modified='yes']]將返回:

RootNode 
BOOK 
foo 
bar 
baz 
yabba 
dabba 
MAGAZINE 
KINDLE_SUB 
EMAIL_SUB 

/*/*[descendant::*[@modified='yes']]將返回:

+0

這些xpaths不會只選擇具有'modified ='yes''但不是父項的元素的第一個祖先嗎? – 2012-04-13 20:15:12

+0

@AlehDouhi - 我不確定你的意思,但'@ modified'的深度並不重要。返回的內容根據使用的是哪個xpath而不同。他們都返回OP想要的內容,除了第一個返回'RootNode'。由於OP聲明示例XML被大大簡化,所以很難說出深度大於示例中預期的結果。我會用一個返回的例子來更新我的答案。 – 2012-04-13 21:12:50

+0

瞭解。是的,我的意思是如果深度會更大,這些xpaths將不會返回直接父項。 – 2012-04-13 21:22:34

1

大概是這樣的:/*//*[*[@modified='yes']]

+0

謝謝DevNull和Aleh。它的作品非常漂亮。 – CraigL 2012-04-14 22:58:16

+2

@CraigL - 請接受一個適合你的答案:) – 2012-04-15 09:40:02

相關問題