J'ai un document XML complet dans une chaîne et je voudrais un Document
objet. Google révèle toutes sortes de déchets. Quelle est la solution la plus simple? (Dans Java 1.5)
Solution Grâce à Matt McMinn , j'ai choisi cette implémentation. Il a le bon niveau de flexibilité d'entrée et de granularité d'exception pour moi. (Il est bon de savoir si l'erreur provient d'un XML malformé SAXException
- ou simplement d'une mauvaise 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;
}
Réponses:
Cela fonctionne pour moi dans Java 1.5 - j'ai supprimé des exceptions spécifiques pour la lisibilité.
la source
getBytes()
sans considération pour l'encodage.return (Document) builder.parse(new ByteArrayInputStream(xml.getBytes()));
??Whoa là!
Il y a un problème potentiellement sérieux avec ce code, car il ignore le codage de caractères spécifié dans le
String
(qui est UTF-8 par défaut). Lorsque vous appelezString.getBytes()
le codage par défaut de la plateforme est utilisé pour coder les caractères Unicode en octets. Ainsi, l'analyseur peut penser qu'il obtient des données UTF-8 alors qu'en fait il obtient EBCDIC ou quelque chose de ce genre ...Au lieu de cela, utilisez la méthode d'analyse qui prend un InputSource, qui peut être construit avec un Reader, comme ceci:
Cela peut ne pas sembler un gros problème, mais l'ignorance des problèmes de codage des caractères conduit à une pourriture insidieuse du code semblable à y2k.
la source
J'ai juste eu un problème similaire, sauf que j'avais besoin d'une NodeList et non d'un document, voici ce que j'ai trouvé. C'est essentiellement la même solution qu'avant, augmentée pour obtenir l'élément racine en tant que NodeList et en utilisant la suggestion d'erickson d'utiliser une InputSource à la place pour les problèmes d'encodage de caractères.
la source
Pour manipuler XML en Java, j'ai toujours tendance à utiliser l'API Transformer:
la source