Chcę czytać dane XML za pomocą XPath w Javie, więc dla zebranych informacji nie jestem w stanie przeanalizować XML zgodnie z moimi wymaganiami.
oto co chcę zrobić:
Pobierz plik XML z Internetu przez jego adres URL, a następnie użyj XPath, aby go przeanalizować, chcę utworzyć w nim dwie metody. Jeden polega na tym, że wprowadzam konkretny identyfikator atrybutu węzła i otrzymuję w rezultacie wszystkie węzły potomne, a drugi zakłada, że chcę uzyskać tylko określoną wartość węzła potomnego
<?xml version="1.0"?>
<howto>
<topic name="Java">
<url>http://www.rgagnonjavahowto.htm</url>
<car>taxi</car>
</topic>
<topic name="PowerBuilder">
<url>http://www.rgagnon/pbhowto.htm</url>
<url>http://www.rgagnon/pbhowtonew.htm</url>
</topic>
<topic name="Javascript">
<url>http://www.rgagnon/jshowto.htm</url>
</topic>
<topic name="VBScript">
<url>http://www.rgagnon/vbshowto.htm</url>
</topic>
</howto>
W powyższym przykładzie chcę odczytać wszystkie elementy, jeśli wyszukuję za pomocą @nazwa, a także jednej funkcji, w której chcę tylko, aby adres URL z @nazwy „Javascript” zwrócił tylko jeden element węzła.
Odpowiedzi:
Potrzebujesz czegoś takiego:
Następnie wywołujesz
expr.evaluate()
przekazanie dokumentu zdefiniowanego w tym kodzie i oczekiwany typ zwrotu, a następnie rzutujesz wynik na typ obiektu wyniku.Jeśli potrzebujesz pomocy z konkretnymi wyrażeniami XPath, powinieneś prawdopodobnie zadać je jako osobne pytania (chyba że to było twoje pytanie w pierwszej kolejności - zrozumiałem twoje pytanie, jak korzystać z API w Javie).
Edycja: (Odpowiedź na komentarz): To wyrażenie XPath otrzyma tekst pierwszego elementu adresu URL w PowerBuilder:
To zapewni ci drugi:
Otrzymasz to dzięki temu kodowi:
Jeśli nie wiesz, ile adresów URL znajduje się w danym węźle, powinieneś raczej zrobić coś takiego:
A następnie zapętlić NodeList.
źródło
Możesz tego spróbować.
Dokument XML
Zapisz jako
employees.xml
.Klasa parsera
Klasa ma następujące metody
Kod źródłowy
źródło
get
metodach. Zmienia się tylko ciąg XPath i większość pozostałej części kodu pozostaje taka sama. Być może wystarczy jedna metoda getValuesForXpath ().Przykład rozpoczęcia pracy:
plik XML:
Kod Java:
źródło
Oto przykład przetwarzania xpath za pomocą vtd-xml ... w przypadku intensywnego przetwarzania XML nie ma sobie równych. oto najnowszy artykuł na ten temat Przetwarzanie XML za pomocą Java - Benchmark wydajności
źródło
Jeśli masz plik XML taki jak poniżej
i chciałem wyodrębnić poniższy plik xml
Poniższy kod pomaga osiągnąć to samo
Teraz, jeśli chcesz tylko xml jak poniżej
Musisz zmienić
String xpathStr = "//Envelope//Header";
doString xpathStr = "//Envelope//Header/*";
źródło
To pokazuje, jak to zrobić
DOM
Nodes
pomocąXPath
Nodes
.Wywołamy kod z poniższą instrukcją
W naszym przypadku chcemy wydrukować część
creatorNames
zbook.xml
użycia"//book/creators/creator/creatorName"
jako xpath, aby wykonaćprintNode
akcję na każdym węźle, który pasuje doXPath
.Pełny kod
Wydruki
Dla
book.xml
źródło
Rozwijając doskonałą odpowiedź @bluish i @Yishai, oto jak sprawić, by NodeLists i atrybuty węzła wspierały iteratory, tj.
for(Node n: nodelist)
Interfejs.Używaj go jak:
i
Kod:
źródło
Odczytaj plik XML za pomocą XPathFactory
SAXParserFactory
iStAX (JSR-173)
.Za pomocą XPath pobierz węzeł i jego dane potomne.
Dokument XML
Wstawiony dla podanego wyrażenia XPath:
Zobacz ten link do naszej własnej implementacji
NamespaceContext
źródło