2010-12-24 15 views
7

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.

+0

sembra che il codice xml di jaxp sia piuttosto disordinato, sei aperto ad altri tipi di apis xml? –

+0

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. –

risposta

11

Che dire di getTextContent()? Questo dovrebbe fare il lavoro.

Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) 
{ 
    Node currentItem = nodes.item(i); 
    String key = currentItem.getAttributes().getNamedItem("key").getNodeValue(); 
    String value = currentItem.getTextContent(); 

    System.out.printf("%1s = %2s\n", key, value); 
} 

Per ulteriori informazioni si prega di consultare Javadoc per getTextContent(). Spero che questo ti possa aiutare.

+0

Copiato, incollato, ha funzionato perfettamente. Grazie! Vado a dare un'occhiata più da vicino a getTextContent(). –

Problemi correlati