2012-03-19 61 views
1

我旁邊的xml:獲取XML節點與最後日期

<Histories> 
    <History> 
     <Date>20.06.2010</Date> 
     <FileName>4.txt</FileName> 
    </History> 
    <History> 
     <Date>05.06.2012</Date> 
     <FileName>2.txt</FileName> 
    </History> 
    <History> 
     <Date>18.12.1999</Date> 
     <FileName>3.txt</FileName> 
    </History> 
</Histories> 

我需要時間來獲得最後一個節點(組XPath女巫返回日期)。我能怎麼做?例如:2.txt

謝謝

+0

對此有何結論? – 2012-03-25 22:07:48

+0

> /史/歷史[ 沒有( (前同輩::歷史|以下同胞::歷史)/日期>日 ) ]不是我甲日 – ShurikEv 2012-03-28 05:38:58

+0

確實工作。在XPath 1.0中使用日期格式不可能做到這一點。提供的替代方案有:XPath 2.0,LINQ to XML,XSLT和XQuery。 – 2012-03-28 05:47:46

回答

2

如果你有在你的XML適當的日期(yyyyddmm,而不是dd.mm.yyyy),這個XPath 1.0將工作:

/Histories/History[ 
    not(
    (preceding-sibling::History | following-sibling::History)/Date > Date 
) 
] 

既然你有你的日期錯誤的方式,XPath 1.0中無法做到這一點。

2

這不是特定於WPF。

您是否嘗試過使用XQueryXLinq

 var element = XElement.Parse(<yourXml>); 
     var lastDateHistoryNode 
       = element.XPathSelectElements("//History").OrderByDescending(
        e => DateTime.ParseExact(
          e.Element("Date").Value, "dd.MM.yyyy", null)).First(); 
     var lastDateFileName = lastDateHistoryNode.Element("FileName").Value; 
0

XPath本身不允許您從有序列表中進行選擇。如果你可以先使用XSLT(特別是<xsl:sort>),以獲得一個分類節點集合,然後選擇第一個或最後一個元素是微不足道的(nodeset[1]nodeset[last()]

若要按時間順序排序的日期,這也是明智的做法是將它們轉換爲ISO第一(YYYY-MM-DD)作爲然後串順序與時間順序一致

+0

XPath不允許您從有序列表中進行選擇,但可以從節點集合中獲取最小值/最大值 - 只要值自然排序(不幸的是,'dd.mm.yyyy'不會這樣做) 。 – Tomalak 2012-03-19 08:35:23

3

在XPath 2.0,你可以做這樣的:

/Histories/History[ 
    concat(substring(Date,7),substring(Date,4,2),substring(Date,1,2)) = 
    max(/Histories/History/concat(substring(Date,7),substring(Date,4,2), 
     substring(Date,1,2))) 
] 

第一部分(concat(...))日期轉換爲YYYYMMDD格式以允許排序。然後將它與文件中的最大值進行比較。

這在XPath 1.x中不可行,因爲沒有max()函數,也不能在路徑末尾調用函數(/Histories/History/concat(...))。

從本質上講,.NET不支持XPath 2.0,但there are libraries that add this

+1

+1。如果OP具有有用的日期格式,那麼在XPath 1.0中這將非常簡單。我已經添加了「如果只有」解決方案。 – Tomalak 2012-03-19 08:32:24

+0

謝謝。我嘗試它 – ShurikEv 2012-03-20 03:46:33