我有一个没有一致结构的XML。我需要看看是否有一种简单的方法来搜索至少有一个具有属性modified =“yes”的子节点的所有父节点。使用XPath有一种简单的方法吗?我将要处理的XML非常庞大,我将使用不具备Visual Studio所有功能的4GL语言,但它确实提供了一些COM对象来帮助导航XML DOM。代码看起来与我在Visual Studio中的操作非常相似(参见下面的示例xml)
示例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节点本身具有此属性。
答案 0 :(得分:1)
尝试:
//*[descendant::*[@modified='yes']]
或更确切地说:
/*/*[descendant::*[@modified='yes']]
编辑:使用上述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']]
会返回:
BOOK
foo
MAGAZINE
KINDLE_SUB
EMAIL_SUB
答案 1 :(得分:1)
可能是这样的:/*//*[*[@modified='yes']]