Ich habe ein vollständiges XML-Dokument in einer Zeichenfolge und möchte ein Document
Objekt. Google taucht alle Arten von Müll auf. Was ist die einfachste Lösung? (In Java 1.5)
Lösung Dank Matt McMinn habe ich mich für diese Implementierung entschieden. Es hat für mich das richtige Maß an Eingabeflexibilität und Ausnahmegranularität. (Es ist gut zu wissen, ob der Fehler von fehlerhaftem XML SAXException
- oder nur von schlechten E / A - herrührt 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;
}
Antworten:
Dies funktioniert für mich in Java 1.5 - ich habe bestimmte Ausnahmen für die Lesbarkeit entfernt.
quelle
getBytes()
ohne Berücksichtigung der Codierung verwendet.return (Document) builder.parse(new ByteArrayInputStream(xml.getBytes()));
?Whoa da!
Es gibt ein potenziell schwerwiegendes Problem mit diesem Code, da er die in
String
(standardmäßig UTF-8) angegebene Zeichencodierung ignoriert . Wenn du anrufstString.getBytes()
die Plattform die Standardcodierung verwendet, um Unicode-Zeichen in Bytes zu codieren. Der Parser könnte also denken, dass er UTF-8-Daten erhält, obwohl er tatsächlich EBCDIC oder etwas anderes erhält… nicht schön!Verwenden Sie stattdessen die Analysemethode, die eine InputSource verwendet, die mit einem Reader wie folgt erstellt werden kann:
Es scheint keine große Sache zu sein, aber die Unkenntnis der Probleme bei der Zeichenkodierung führt zu heimtückischem Code, der dem Jahr 2000 ähnelt.
quelle
Hatte gerade ein ähnliches Problem, außer dass ich eine NodeList und kein Dokument brauchte. Hier ist, was ich mir ausgedacht habe. Es ist größtenteils die gleiche Lösung wie zuvor, erweitert, um das Stammelement als NodeList zu speichern und den Vorschlag von erickson zu verwenden, stattdessen eine InputSource für Zeichencodierungsprobleme zu verwenden.
quelle
Um XML in Java zu manipulieren, verwende ich immer die Transformer-API:
quelle