1

我有一个没有一致结构的 XML。我需要看看是否有一种简单的方法来搜索所有父节点,这些父节点至少有一个属性为 modified="yes" 的子节点。有没有一种简单的方法可以用 XPath 做到这一点?我将要处理的 XML 非常庞大,我将使用一种 4GL 语言,它不具备 Visual Studio 的所有功能,但它确实提供了一些 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 节点本身具有此属性。

4

2 回答 2

2

大概是这样的:/*//*[*[@modified='yes']]

于 2012-04-13T19:20:05.290 回答
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
于 2012-04-13T19:09:04.443 回答