2011-08-24 10 views
6

私はxmlファイルの次の部分を持っています。C#でXPathを使用して最後のノードを取得する方法は?

<UN N="@U1"> 
    <DT N="24/06/2011"> 
     <PN N="@P1"> 
      <TM N="02:24:11"> 
       <JB T="GP"> 
        <A>notepad</A> 
        <Z>Notepad</Z> 
        <N>Untitled - Notepad</N> 
        <J>1;0;1;1;0;0</J> 
        <C>0.00500;0.09500;0.03500</C> 
        <S>1;0;1;1</S> 
        <P>0;0</P> 
        <F>0</F> 
       </JB> 
      </TM> 
     </PN> 
    </DT> 

    <DT N="23/06/2011"> 
     <PN N="@P1"> 
      <TM N="02:38:49"> 
       <JB T="PAGP"> 
        <A>notepad</A> 
        <Z>Notepad</Z> 
        <N>Untitled - Notepad</N> 
        <J>1;1;1;1;0;1</J> 
        <C>0.00500;0.09500;0.03500</C> 
        <S>1;1;0;0</S> 
        <P>1;1</P> 
        <F>0</F> 
       </JB> 
      </TM>    
     </PN> 
    </DT> 

    ..... 
    ..... 

</UN> 

PN N = @ P1の最後のノードを取得する必要があります。

サンプルクエリは高く評価されます。

ありがとうございます。

+0

あなたが探しています「

」または「」ノードが見つかりましたか? – Richard

答えて

5

last() XPath関数を使用してノードセットの最後を見つけることができます。だから、値@P1を持つattribyte Nとの最後の<PN>のノードは次のようになります。

//PN[@N='@P1'][position() = last()] 

.NETコードを使用しているどのXMLのAPIに依存します:XMLへXmlDocumentXPathDocumentまたはLINQ(XDocumentを)。 (XmlReaderとアプローチ3のいずれかにロードし、次にそれを使用することであろう。)(コメントに基づいて)

編集は上記属性で最後<PN><F>子孫を返すには、xDocでありXmlDocumentのインスタンス:

var foundNode = xDoc.SelectSingleNode("//PN[@N='@P1'][position() = last()]/TM/JB/F"); 

編集#2(別のコメントに基づいて):各<DT>は、複数の0を含めることができます最後<PN>を返すために、要素のすべての要素に渡って要素。

XmlElement.SelectNodesを使って、より良いサンプルXML(以下を参照)でこれをテストし、返されたノードセットを反復処理すると、正しいノードが見つかったことがわかりました。これは最初のものではなかったため、SelectSingleNodeによって返されませんでした。これは手がかりです:一致する//PN[@N='@P1']内にlast()述語が適用されていました。複数の要素が可能である場合にそうでない読者にのみ特異事例を想定し、試料中の少なくとも二つを示し、その後、将来の参照のため

(//PN[@N='@P1'])[last()] 

:優先の迅速変化が必要とされたもの全てでした。また、必要ではない(子供のような)すべてのノードを取り除く:

私は(xはそれが簡単にテストしながら、選択された要素を識別できるように属性を追加)テストのために使用したサンプルXMLを:

<UN N='@U1'> 
    <DT N='24/06/2011'> 
    <PN N='@P1' x='#1'/> 
    <PN N='@P1' x='#2'/> 
    <PN N='@P2' x='#3'/> 
    </DT> 

    <DT N='24/06/2011'> 
    <PN N='@P1' x='#4'/> 
    <PN N='@P1' x='#5'/> 
    <PN N='@P2' x='#6'/> 
    </DT> 

    <DT N='24/06/2011'> 
    <PN N='@P3' x='#7'/> 
    <PN N='@P4' x='#8'/> 
    <PN N='@P5' x='#9'/> 
    </DT> 
</UN> 
+0

ありがとうございます。うまく働いています。返されたノードからTM/JB/Fの最後のノードを取得したい場合私はXmlDocumentクラスを使用しています。 – Syed

+0

自分自身を見つけました。/ JB/F ";"/"/ /"// "/どのように初期のXPathに感謝します。 – Syed

+0

ごめんなさい。最初のDTの最後のPNノードを返しますが、.xmlファイルのDTに関係なく最後のノードが必要です。注:.xmlファイルには任意の数のDTを含めることができ、内部DTには多数のPNが含まれます。 – Syed

6

のXPath操作:

"/UN/DT[PN/@N='@p1'][last()]" 

[email protected]のための最後のDTノードを返します。

関連する問題