Question

J'ai un document XML complet dans une chaîne et j'aimerais un Document objet.Google trouve toutes sortes de déchets.Quelle est la solution la plus simple ?(En Java 1.5)

Solution Grâce à Matt McMinn, j'ai opté pour cette implémentation.Il a le bon niveau de flexibilité d’entrée et de granularité des exceptions pour moi.(Il est bon de savoir si l'erreur provient d'un XML mal formé - SAXException - ou tout simplement 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;
}
Était-ce utile?

La solution

Cela fonctionne pour moi dans Java 1.5 - j'ai supprimé les 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()));
}

Autres conseils

Waouh là !

Il existe 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).Quand vous appelez String.getBytes() le codage par défaut de la plate-forme 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 des données EBCDIC ou quelque chose du genre… ce n'est pas joli !

Utilisez plutôt la méthode parse qui prend un InputSource, qui peut être construit avec un Reader, comme ceci :

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

Cela peut ne pas sembler grave, mais l’ignorance des problèmes d’encodage des caractères conduit à une pourriture insidieuse du code semblable à celle de l’an 2000.

Je viens d'avoir un problème similaire, sauf que j'avais besoin d'une NodeList et non d'un document, voici ce que j'ai trouvé.Il s'agit essentiellement de la même solution qu'auparavant, augmentée pour réduire l'élément racine en tant que NodeList et en utilisant la suggestion d'Erickson d'utiliser un InputSource à la place pour les problèmes de codage 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;
    }

Pour manipuler du XML en Java, j'ai toujours tendance à utiliser l'API Transformer :

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();
}   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top