XPath以获取具有任何具有特定属性的子节点的所有父节点

时间:2012-04-13 18:58:09

标签: xpath

我有一个没有一致结构的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节点本身具有此属性。

2 个答案:

答案 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']]