103 votes

Comment charger un document org.w3c.dom.Document à partir de XML dans une chaîne?

J'ai un document XML complet dans une chaîne de caractères et que vous souhaitez un Document objet. Google transforme toutes sortes d'ordures. Quelle est la solution la plus simple? (En Java 1.5)

Solution Grâce à Matt McMinn, j'ai décidé de cette mise en œuvre. Il a le bon niveau de souplesse en matière d'entrée et à l'exception de granularité pour moi. (Il est bon de savoir si l'erreur vient de XML mal formé - SAXException - ou tout simplement mauvais 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;
}

148voto

erickson Points 127945

Oh là là!

Il y a un problème potentiellement grave avec ce code, car il ignore le codage de caractères spécifié dans l' String (ce qui est de l'UTF-8 par défaut). Lorsque vous appelez String.getBytes() la plate-forme de codage par défaut est utilisé pour le codage de caractères Unicode en octets. Ainsi, l'analyseur peut penser que c'est l'obtention de données UTF-8, alors qu'en fait il se EBCDIC ou quelque chose de... pas joli!!!

Au lieu de cela, utilisez la méthode d'analyse qui prend un InputSource, qui peut être construit avec un Lecteur, comme ceci:

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

Cela peut ne pas sembler une grosse affaire, mais l'ignorance de l'encodage des caractères les problèmes de conduit à insidieuse code de la pourriture s'apparente à y2k.

79voto

Matt McMinn Points 6067

Cela fonctionne pour moi dans Java 1.5 - J'ai supprimé des exceptions spécifiques pour des raisons de lisibilité.

 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()));
}
 

9voto

shsteimer Points 8749

Je viens d'avoir un problème similaire, sauf que j'avais besoin d'une liste de noeuds et non d'un document. Voici ce que j'ai proposé. Il s’agit essentiellement de la même solution qu’auparavant, augmentée pour obtenir l’élément racine sous la forme d’une liste de noeuds et utilisant la suggestion de erickson d’utiliser un InputSource à la place pour les problèmes d’encodage de caractères.

 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;
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X