"Polowałem wysoko i nisko i znalazłem bardzo interesującą funkcjonalność z XPATH, ale nie znalazłem sposobu na przetestowanie DAT.
Mam atrybut Date, który chcę użyć do pobrania kolekcji węzłów.
<History>
<item>
<Name>string</Name>
<Location>string</Location>
<VisitDate>01/08/2013</VisitDate>
<Description>string</Description>
</item>
</History>
Kod XPath z powodzeniem znajduje równe wartości, ale muszę wykonać test =>.
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)
Teraz to nie działa, ale jest błędne SelectNodes(s)
, więc oczywiście nie lubi ">" bitów.
Czy są jakieś funkcje "Date" w XPath, znalazłem boolean()
; concat()
; true()
; not true()
; translate()
; substring()
itp., i przypuszczam, że zamierzam w końcu użyć kombinacji tych i być może innych, ale nie mogę wymyślić, jak to zrobić "większego niż".
Czy jest ktoś tam ze zrozumieniem XPath w tym obszarze?
Odpowiedzi:
1 dla odpowiedzi № 1Zawsze stwierdziłem, że najprostszym sposobem porównania dat w XPath jest przekonwertowanie ich na liczby całkowite w formacie YYYYMMDD, tj. Standardowy format daty XML, ale z usuniętymi łącznikami.
W efekcie uzyskujesz skuteczne porównanie następujących elementów:
translate("2013-08-01", "-", "") > 20130824
Szkoda, że twoje daty są zapisywane jako DD / MM / YYYY zamiast YYYY-MM-DD, ponieważ oznacza to, że będziesz musiał pracować z substring()
zreorganizować wartości, ale powinno to być łatwe.
0 dla odpowiedzi nr 2
XPath 2.0 ma znacznie lepszą zdolność operowania datą i czasem niż XPath 1.0. Natywny procesor XPath w .NET obsługuje tylko XPath 1.0, ale wsparcie dla wersji 2.0 jest dostępne w co najmniej dwóch produktach firm trzecich działających pod kontrolą .NET: Saxon (mój produkt) i XmlPrime.
XPath 2.0 nadal wymaga daty w formacie ISO yyyy-mm-dd
, ale jest to łatwe do przekształcenia dd/mm/yyyy
, na przykład za pomocą wyrażeń regularnych.