我有一個沒有一致結構的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節點本身具有此屬性。
這些xpaths不會只選擇具有'modified ='yes''但不是父項的元素的第一個祖先嗎? – 2012-04-13 20:15:12
@AlehDouhi - 我不確定你的意思,但'@ modified'的深度並不重要。返回的內容根據使用的是哪個xpath而不同。他們都返回OP想要的內容,除了第一個返回'RootNode'。由於OP聲明示例XML被大大簡化,所以很難說出深度大於示例中預期的結果。我會用一個返回的例子來更新我的答案。 – 2012-04-13 21:12:50
瞭解。是的,我的意思是如果深度會更大,這些xpaths將不會返回直接父項。 – 2012-04-13 21:22:34