2011-09-12 5 views
9

Sto avendo un po 'di problemi con l'analisi un po' di XML in Java. Il mio file XML viene letto correttamente e sono in grado di ottenere la maggior parte delle informazioni dal file senza alcun problema (ad esempio il nodo StreamType, mostrato nello snippet xml), utilizzando la funzione getTextContent() dei nodi.parsing XML in Java - getTextContent() e getNodeValue() restituire solo n, t, e gli spazi

MA, quando provo a lavorare con figli di un nodo, sia getNodeValue() che getTextContent() restituiscono questo valore casuale: "\ n \ t \ t".

Il NodeList propertyNodes sembra essere correttamente popolato (contiene tutti i 18 elementi "Proprietà").

Ecco un frammento dal mio codice:

Document document; 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
document = builder.parse(appXML); 

... 

String typeName = document.getElementsByTagName("StreamType").item(0).getTextContent(); 

... 

String limit = "-1"; 
NodeList propertyNodes = document.getElementsByTagName("Property"); 
int nodelistlength = propertyNodes.getLength(); 
for (int i = 0; i < nodelistlength; i++) { 
    Node currentNode = propertyNodes.item(i); 
    Node nameNode = currentNode.getFirstChild(); 
    Node valueNode = currentNode.getLastChild(); 

    String name = nameNode.getNodeValue(); 
    String value = valueNode.getNodeValue(); 

    if (nameNode.getTextContent().equalsIgnoreCase("maxConnections")) 
     limit = valueNode.getTextContent(); 
} 

Ed ecco alcuni tagli dalla XML sto cercando di analizzare:

<Root> 
<Application> 
    <Streams> 
    <StreamType>live</StreamType> 
    ... 
    </Streams> 

    ... 

    <Properties> 

    ... 

    <Property> 
    <Name>maxConnections</Name> 
    <Value>1000</Value> 
    </Property> 

    ... 

    </Properties> 
</Application> 
</Root> 

Qualsiasi idea di quello che potrebbe essere sbagliato qui? Grazie mille!

EDIT: ora funziona, grazie al tutorial pubblicato da @Home. Questo è come ho fissato il codice:

1) Modificato il blocco di codice che inizia con "limite di String" e termina con la per la staffa fine del ciclo:

String limit = "-1"; 
NodeList propertyNodes = document.getElementsByTagName("Property"); 
for (int i = 0; i < propertyNodes.getLength(); i++) { 
    Node currentNode = propertyNodes.item(i); 

    if (currentNode.getNodeType() != Node.ELEMENT_NODE) 
     continue; 

    Element currentElement = (Element)currentNode; 

    if (getTagValue("Name",currentElement).equalsIgnoreCase("maxConnections")) 
     limit = getTagValue("Value",currentElement); 
} 

2) Aggiunto questa comoda funzione dal tutorial:

private static String getTagValue(String sTag, Element eElement) { 
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); 
    Node nValue = (Node) nlList.item(0); 
    return nValue.getNodeValue(); 
} 

Recupera le coppie nome/valore figlio dell'elemento "Proprietà" in modo impeccabile ora. Grazie mille!

+0

Qual è il motivo che non è possibile utilizzare JAXB? – ChadNC

+1

@home, il tuo tutorial ha risolto il mio problema e ora il mio codice funziona! Potresti postare questo come risposta in modo da poterlo contrassegnare come "migliore" e dargli un upvote? Grazie mille! :) –

+0

@Katherine Williams: risposta aggiunta :-) – home

risposta

7

Purtroppo, il DOM Java non è così facile da usare. È necessario distinguere tra diversi tipi di nodi. Non è il miglior tutorial, ma questo è quello che ho appena trovato usando Google: http://mkyong.com/java/how-to-read-xml-file-in-java-dom-parser

+0

Grazie! Era esattamente ciò di cui avevo bisogno. Mi spiace di non aver potuto anche votare, ma richiede 15 rappresentanti. –

2

Questo è il contenuto corretto del valore del nodo.

<a> 
    <b> 
     stuff 
    </b> 
</a> 

Il valore del nodo a (che in questo caso è pari al contenuto di testo) non correttamente costituito dal spazio tra l'inizio e il tag di chiusura, omettendo naturalmente gli spazi nel tag b perché, ben , appartiene al tag b e non a a.