Come posso fare type-safe query XPath in Java?
-
27-09-2019 - |
Domanda
Attualmente sto usando JDOM per fare un po 'di analisi semplice XML, e sembra che il tipo sicuro di niente - ho avuto un problema simile con utilizzando il built-in Java parser DOM, solo con un sacco di più API per guadare attraverso
Per esempio, XPath.selectNodes
prende un Object
come argomento e restituisce un elenco grezzo, che ha appena sente un po 'Java 1.1
Ci sono generic-ized XML e librerie per Java XPath, o c'è qualche motivo per cui non è proprio possibile fare query XPath in modo type-safe?
Soluzione
Se si ha familiarità con i selettori CSS in HTML, può essere utile sapere che Jsoup supporti XML pure.
Aggiorna : OK, che è stato dato il downvote a quanto pare una risposta molto controversa. Può tuttavia finiscono per essere più facile e meno prolisso di XPath quando invece si è per selezionare i valori dei nodi. L'API Jsoup è cioè molto liscia. Diamo un po 'esempio più concreto. Supponendo che si dispone di un file XML, che simile a questa:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>John Doe</name>
<age>30</age>
<address>
<street>Main street 1</street>
<city>Los Angeles</city>
</address>
</person>
<person id="2">
<name>Jane Doe</name>
<age>40</age>
<address>
<street>Park Avenue 1</street>
<city>New York</city>
</address>
</person>
</persons>
Quindi è possibile attraversarlo come segue:
Document document = Jsoup.parse(new File("/persons.xml"), "UTF-8");
Element person2 = document.select("person[id=2]").first();
System.out.println(person2.select("name").text());
Elements streets = document.select("street");
for (Element street : streets) {
System.out.println(street.text());
}
quali uscite
Jane Doe Main street 1 Park Avenue 1
Aggiorna 2 :. Dal Jsoup 1.6.2 che è stato rilasciato Marzo 2012, parsing XML è ufficialmente supportato dall'API Jsoup
Altri suggerimenti
Per quanto ne sappia tutte le query XML in Java sono non-typesafe e la maggior parte sono java 1.3 compatibili. Detto questo il mio parser / generatore preferito è il xml tirare parser (xmlpp) parser stile. Credo che Java ha XmlStreamReader e XmlStreamWriter se si sta utilizzando 1.6, che sono quasi la stessa come la biblioteca xmlpp. Mi piace soprattutto che posso scrivere un metodo getFoo che prende un lettore di flusso e tira da esso e restituisce un oggetto Foo. È un po 'il migliore tra i DOM e SAX. Penso che possa essere indicato come StAX da alcuni.
Sto diventando un po 'di passeggiata-y così sto smettere ora