Frage

Ich habe ein vollständiges XML-Dokument in einem String und möchte ein Document Objekt.Google deckt jede Menge Müll auf.Was ist die einfachste Lösung?(In Java 1.5)

Lösung Dank an Matt McMinn, Ich habe mich für diese Implementierung entschieden.Für mich bietet es das richtige Maß an Eingabeflexibilität und Ausnahmegranularität.(Es ist gut zu wissen, ob der Fehler von fehlerhaftem XML herrührt – SAXException - oder einfach nur schlechtes IO - IOException.)

public static org.w3c.dom.Document loadXMLFrom(String xml)
    throws org.xml.sax.SAXException, java.io.IOException {
    return loadXMLFrom(new java.io.ByteArrayInputStream(xml.getBytes()));
}

public static org.w3c.dom.Document loadXMLFrom(java.io.InputStream is) 
    throws org.xml.sax.SAXException, java.io.IOException {
    javax.xml.parsers.DocumentBuilderFactory factory =
        javax.xml.parsers.DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    javax.xml.parsers.DocumentBuilder builder = null;
    try {
        builder = factory.newDocumentBuilder();
    }
    catch (javax.xml.parsers.ParserConfigurationException ex) {
    }  
    org.w3c.dom.Document doc = builder.parse(is);
    is.close();
    return doc;
}
War es hilfreich?

Lösung

Das funktioniert bei mir in Java 1.5 – ich habe bestimmte Ausnahmen aus Gründen der Lesbarkeit entfernt.

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;

public Document loadXMLFromString(String xml) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();

    return builder.parse(new ByteArrayInputStream(xml.getBytes()));
}

Andere Tipps

Wow!

Bei diesem Code besteht möglicherweise ein schwerwiegendes Problem, da er die in angegebene Zeichenkodierung ignoriert String (standardmäßig UTF-8).Wenn du anrufst String.getBytes() Die Standardkodierung der Plattform wird verwendet, um Unicode-Zeichen in Bytes zu kodieren.Der Parser könnte also denken, dass er UTF-8-Daten erhält, obwohl er in Wirklichkeit EBCDIC oder so etwas erhält ... nicht schön!

Verwenden Sie stattdessen die Parse-Methode, die eine InputSource benötigt, die mit einem Reader wie folgt erstellt werden kann:

import java.io.StringReader;
import org.xml.sax.InputSource;
…
        return builder.parse(new InputSource(new StringReader(xml)));

Es scheint vielleicht keine große Sache zu sein, aber die Unkenntnis der Zeichenkodierungsprobleme führt zu heimtückischer Codefäule, ähnlich wie im Jahr 2000.

Hatte gerade ein ähnliches Problem, außer dass ich eine NodeList und kein Dokument brauchte, hier ist, was ich mir ausgedacht habe.Es handelt sich größtenteils um die gleiche Lösung wie zuvor, erweitert um das Stammelement als NodeList und um die Verwendung von Ericksons Vorschlag, stattdessen eine InputSource für Zeichenkodierungsprobleme zu verwenden.

private String DOC_ROOT="root";
String xml=getXmlString();
Document xmlDoc=loadXMLFrom(xml);
Element template=xmlDoc.getDocumentElement();
NodeList nodes=xmlDoc.getElementsByTagName(DOC_ROOT);

public static Document loadXMLFrom(String xml) throws Exception {
        InputSource is= new InputSource(new StringReader(xml));
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = null;
        builder = factory.newDocumentBuilder();
        Document doc = builder.parse(is);
        return doc;
    }

Um XML in Java zu manipulieren, verwende ich immer die Transformer-API:

import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;

public static Document loadXMLFrom(String xml) throws TransformerException {
    Source source = new StreamSource(new StringReader(xml));
    DOMResult result = new DOMResult();
    TransformerFactory.newInstance().newTransformer().transform(source , result);
    return (Document) result.getNode();
}   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top