2013-08-31 112 views
1

我已經找到了高和低,並發現一些XPATH非常有趣的功能,但是,我還沒有找到一種方法來測試日期。XPath測試日期

我有一個Date屬性,我想用來獲取節點的集合。

<History> 
     <item> 
      <Name>string</Name> 
      <Location>string</Location> 
      <VisitDate>01/08/2013</VisitDate> 
      <Description>string</Description> 
     </item> 
</History> 

XPath代碼愉快地找到一個等號,但我需要執行=>測試。

Dim doc As New Xml.XmlDocument 
doc.Load(filename) 
Dim d As Date = DateAdd(DateInterval.Day, -7, Today) 
s = "//History/item[VisitDate=>'" & d.ToString("dd/MM/yyyy") & "']" 
Dim nodes As Xml.XmlNodeList = doc.SelectNodes(s) 

現在這是行不通的。它在SelectNodes(s)處出錯,所以它顯然不喜歡「>」位。

XPath中是否有「Date」函數,我找到了boolean(); concat(); true(); not true(); translate(); substring()等,我假設我將最終必須使用這些,也許其他人的組合,但我不知道如何做「大於」......

是有沒有人瞭解這方面的XPath?

回答

1

我一直髮現,在XPath中比較日期的最簡單方法是將它們轉換爲YYYYMMDD形式的整數,即標準的XML日期格式,但刪除了連字符。

你結束了以下的有效比較:

translate('2013-08-01', '-', '') > 20130824 

這是一個恥辱,你的日期爲DD/MM/YYYY而不是YYYY-MM-DD,因爲它意味着你必須保存與substring()做一些工作來重組值,但它應該很容易。

+1

我不能格式化這個,我不能「回答」,所以原諒閱讀這個難點---------所以,下面是一個合理的解決方案? --------- Dim d As Date = DateAdd(DateInterval.Day,-2,Today)--------- s =「// History/item [translate(substring( VisitDate,1,string-length(substring-before(VisitDate,''))),' - ','')>「&d.ToString(」yyyyMMdd「)&」']「------- - 我已將所有日期更改爲--------- yyyy-mm-dd hh:mm --------- 按照您的建議使用XML。我還將DateAdd更改爲-2,以便我可以執行「>」 –

+0

是的,這看起來應該起作用。 – Ben

+0

好吧,除了我之前的流言單引號外,這個工程!是!非常感謝所有人...... –

0

XPath 2.0比XPath 1.0有更好的日期和時間處理能力。 .NET中的本機XPath處理器僅支持XPath 1.0,但支持2.0的產品至少可以在兩種運行於.NET下的第三方產品中使用:Saxon(我的產品)和XmlPrime。

XPath 2.0仍然要求日期採用ISO格式yyyy-mm-dd,但它很容易從dd/mm/yyyy轉換爲此格式,例如使用正則表達式。

+0

我在哪裏可以找到XPath 2.0? –

+0

試試Google ..... –