Dato un documento XML che è simile al seguente:recuperare il valore del nodo XML e attributi nodo utilizzando XPath in JAXP
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="agentType">STANDARD</entry>
<entry key="DestinationTransferStates"></entry>
<entry key="AgentStatusPublishRate">300</entry>
<entry key="agentVersion">f000-703-GM2-20101109-1550</entry>
<entry key="CommandTimeUTC">2010-12-24T02:25:43Z</entry>
<entry key="PublishTimeUTC">2010-12-24T02:26:09Z</entry>
<entry key="queueManager">AGENTQMGR</entry>
</properties>
voglio stampare i valori dell'attributo "chiave" e l'elemento in modo che appaia in questo modo:
agentType = STANDARD
DestinationTransferStates =
AgentStatusPublishRate = 300
agentVersion = f000-703-GM2-20101109-1550
CommandTimeUTC = 2010-12-24T02:25:43Z
PublishTimeUTC = 2010-12-24T02:26:09Z
queueManager = AGENTQMGR
sono in grado di stampare i valori dei nodi senza alcun problema utilizzando questo codice:
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//properties/entry/text()");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
E posso stampare i valori dell'attributo "chiave", modificando l'espressione XPath e metodi nodo come segue:
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//properties/entry");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getAttributes().getNamedItem("key").getNodeValue());
}
Sembra che ci sarebbe un modo per arrivare a entrambi questi valori in un unico evaluate
. Potrei sempre valutare due NodeList e scorrere attraverso di essi con un indice comune, ma non sono sicuro che sia garantito che vengano restituiti nello stesso ordine. Ogni suggerimento è apprezzato.
sembra che il codice xml di jaxp sia piuttosto disordinato, sei aperto ad altri tipi di apis xml? –
Una volta ottenuto il funzionamento del codice JAXP, l'ho scritto in XSLT. Era molto più pulito (sembra HTML con qualche markup aggiunto), ma richiede un rendering per sempre. Proverò XSLT con una translet successiva. Altri suggerimenti sicuramente ben accetti. –