2017-11-01 21 views
0
<XXX> 
    <SHORT-NAME>ELEMENT1</SHORT-NAME> 
    <YYY> 
     <ZZZ> 
      <SHORT-NAME>ELEMENT2</SHORT-NAME> 
      <AAA> 
       <BBB> 
        <SHORT-NAME>ELEMENT3</SHORT-NAME> 
        <CCC></CCC> 
        <DDD></DDD> 
        <EEE></EEE> 
        <FFF> 
         <SHORT-NAME>ELEMENT4</SHORT-NAME> 
        </FFF> 
        <GGG> 
         <SHORT-NAME>ELEMENT6</SHORT-NAME> 
        </GGG> 
       </BBB> 
       <HHH> 
        <SHORT-NAME>ELEMENT5</SHORT-NAME> 
       </HHH> 
      </AAA> 
     </ZZZ> 
    </YYY> 
</XXX> 

要素は、それぞれパッケージまたはコンテナを表し、各サブ要素は、その親のサブ要素またはパッケージを表します。パッケージの名前は、SHORT-NAMEに基づいています。要素とその子パッケージの間に任意の数の要素が存在する可能性があります。このXMLファイルは私に提供されていて、このレイアウトがよく定義されているので、変更する際に入力がありません。要素値の伝承に基づいてXMLノードを取得する

上記のXML内のさまざまな要素に対処する「その他」の方法は、親に対する相対的な位置に基づいており、そのSHORT-NAMEによって対処されます。たとえば、上記の例では、/ELEMENT1/ELEMENT2/ELEMENT3/ELEMENT4は、そのショートネームに基づいて<FFF>要素に対処する有効な方法です。反面、/ELEMENT1/ELEMENT2/ELEMENT4のようなものは、ELEMENT4が技術的にELEMENT3の「子」であるため、ELEMENT4に対処する有効な方法ではありません。

だから私は彼らのSHORT-名前に基づいて特定の要素を取得するために、XPathを使用する方法について昨日質問を投稿していたし、提案されたソリューションは、このようなものだった:

//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//*[SHORT-NAME='ELEMENT3']//*[SHORT-NAME='ELEMENT4'] 

これは、上記の例で動作します

//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//[SHORT-NAME='ELEMENT4'] 

誰かが彼らが必要とする要素の正確なパス/ heiarchyを知らない場合、それはまだELEMENT4を取得し、実際にになります。しかし、これでISSEではなく、私はこのようなXPathを使用した場合ということです、彼らはしないでくださいそれを取得することができます。これは重要なポイントです。

これはXPathクエリで解決できると私は期待しています。

+1

を必要と返すべきではありません、あなたはSHORT-NAME子を持つすべての祖先がパスで言及された場合にのみ、ノードを希望返します。 *はXPathに記載する必要がありますか? – Andersson

+0

上記の例では、ELEMENT4とELEMENT6は「兄弟」とみなされ、「親」はELEMENT3です。したがって、ELEMENT4またはELEMENT6に対処するには、/ ELEMENT1/ELEMENT2/ELEMENT3/ELEMENT4または/ ELEMENT1/ELEMENT2/ELEMENT3/ELEMENT6が必要です。これらのパスのみがこれらのノードに対処できます。 – bryken

+0

彼は以下の彼の提案された解決策として私の答えから必要な情報を得ることができたようです。ヘルプをよろしくお願いいたします。 – bryken

答えて

1

あなたは以下を使用しようとすることができます:

//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//*[SHORT-NAME='ELEMENT3']//*[SHORT-NAME='ELEMENT4' and count(./ancestor-or-self::*[./SHORT-NAME])=4] 

アイデアは(提供された例では、それは"4"です)手動でパスに記載されたノードの数を指定することです。発現は*あなたは `SHORT-NAME`の子を持つすべてのノードことを意味するかそう

//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//*[SHORT-NAME='ELEMENT4' and count(./ancestor-or-self::*[./SHORT-NAME])=3] 

あなたはノード

+0

うわー!これはうまくいく!ありがとうございました – bryken

関連する問題