1

一貫した構造を持たないXMLがあります。属性modified="yes"を持つ子ノードが少なくとも1つあるすべての親ノードを検索する簡単な方法があるかどうかを確認する必要があります。XPathでこれを行う簡単な方法はありますか?私が扱うXMLはかなり巨大で、Visual Studioのすべての機能を備えていない4GL言語で作業しますが、XMLDOMのナビゲートに役立ついくつかのCOMオブジェクトを提供します。コードは、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 に答える