2011-08-24 91 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函數可用於查找節點集的最後一個。因此,與attribyte N具有值@P1最後<PN>節點是:

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

的.NET代碼將取決於XML API你使用:XmlDocumentXPathDocument或LINQ到XML(XDocument)。 (與XmlReader的辦法是裝入三個中的一個,然後使用它。)

編輯(基於評論)返回如上,其中xDoc是在<F>後裔最後<PN>與屬性的XmlDocument實例:

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

編輯#2(基於另一個評論):要返回最後<PN>其中每個<DT>可以包含多個<DT>元素橫跨所有<DT>元素。

有一些更好的示例XML這個測試(見下文),使用XmlElement.SelectNodes然後遍歷返回節點集表明,正確的節點正被發現,它只是不是第一個,因此不受SelectSingleNode返回。這是線索:last()謂詞被應用在每個//PN[@N='@P1']匹配內。優先級的快速變化是所有需要:

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

以供將來參考,如果多個元素是可能的,那麼表明樣品中至少兩個,否則讀者會認爲只有單一實例。同時去掉所有節點(如兒童)沒有必要:

我用於測試的樣品XML(加X屬性,使之易於識別,同時測試所選擇的元素):

<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

我發現自己。它會是這樣的:'@「// PN [@N ='@ P1'] [position()= last()]/TM [position()= last()]/JB/F」;'任何感謝最初的XPath。 – Syed

+0

對不起,晚評。它返回第一個DT的最後一個PN節點,但我需要最後一個節點,而不管DT在.xml文件中。注意:.xml文件可以包含任意數量的DT,DT內部包含許多PN。 – Syed

6

中的XPath操作:

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

將返回其[email protected]最後DT節點。

相關問題