2012-04-06 2 views
3

Ich habe noch nie XMLs verarbeitet, daher bin ich nicht sicher, wie CDATA in einer XML-Datei verarbeitet werden soll. Ich bin verloren in Knoten, Eltern, Kind Knoten, nList, etc.Verarbeitung von CDATA aus XML über DOM-Parser

Kann mir jemand sagen, was mein Problem ist aus diesen Codeschnipsel?

Meine getTagValue()-Methode funktioniert für alle Tags außer "Details", die CDATA enthält.

..... 
NodeList nList = doc.getElementsByTagName("Assignment"); 
for (int temp = 0; temp < nList.getLength(); temp++) { 
    Node nNode = nList.item(temp); 
    if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
     Element eElement = (Element) nNode; 
     results = ("Class : " + getTagValue("ClassName", eElement)) + 
        ("Period : " + getTagValue("Period", eElement)) + 
        ("Assignment : " + getTagValue("Details", eElement)); 
     myAssignments.add(results); 
    } 
} 
..... 
private String getTagValue(String sTag, Element eElement) { 
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); 

    Node nValue = (Node) nlList.item(0); 
    if((CharacterData)nValue instanceof CharacterData) 
    { 
     return ((CharacterData) nValue).getData(); 
    } 
    return nValue.getNodeValue(); 
} 
+0

Abgesehen von Bogdan ausgezeichnete Erklärung, wenn Sie Xom verwenden können, Dom4J, etc, werden Sie wahrscheinlich besser für sie. –

Antwort

5

ich den Verdacht, dass Ihr Problem aus dem getTagValue Verfahren in der folgenden Codezeile:

Node nValue = (Node) nlList.item(0); 

Sie sind immer das erste Kind bekommen! Aber Sie könnten mehr als einen haben.

Das folgende Beispiel hat drei Kinder: Textknoten „Detail“, CDATA-Knoten „mit cdata“ und Textknoten „hier“:

<Details>detail <![CDATA[with cdata]]> here</Details> 

Wenn Sie Ihren Code ausführen, erhalten Sie nur „Detail“, du verlierst den Rest.

Das folgende Beispiel hat 1 Kind: ein CDATA-Knoten "Detail mit cdata hier":

<Details><![CDATA[detail with cdata here]]></Details> 

Wenn Sie Ihren Code ausführen, bekommt man alles.

Aber das gleiche Beispiel wie oben geschrieben diese Weise:

<Details> 
    <![CDATA[detail with cdata here]]> 
</Details> 

jetzt 3 Kinder hat, weil die Räume und Zeilenumbrüche werden als Textknoten aufgenommen. Wenn Sie Ihren Code ausführen, erhalten Sie den ersten leeren Textknoten mit einem Zeilenvorschub, Sie verlieren den Rest.

Sie müssen entweder alle untergeordneten Elemente durchlaufen (egal wie viele) und den Wert verketten, um das vollständige Ergebnis zu erhalten, oder wenn es nicht wichtig ist, zwischen reinem Text und Text innerhalb von CDATA zu unterscheiden coalescing Eigenschaft auf der Dokumenterstellungs Fabrik zuerst:

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
docFactory.setCoalescing(true); 
... 

Coalescing specifies that the parser produced by this code will convert CDATA nodes to Text nodes and append it to the adjacent (if any) text node. By default the value of this is set to false.

+0

suchte nur nach dem selben in js, also hat 'element.childNodes [0] .nodeValue' anstelle von' element.nodeValue' einen Trick für mich gemacht, danke! –