50 votes

Comment puis-je convertir org.w3c.dom.Element en format chaîne de caractères en java ?

J'ai un org.w3c.dom.Element passé dans ma méthode. J'ai besoin de voir l'ensemble de la chaîne xml, y compris ses nœuds enfants (le graphe d'objets complet). Je cherche une méthode qui puisse convertir l'objet Element en une chaîne de format xml que je peux System.out.println sur. Juste println() sur l'objet 'Element' ne fonctionnera pas car toString() ne sortira pas le format xml et ne passera pas par son noeud enfant. Existe-t-il un moyen simple de le faire sans écrire ma propre méthode ? Merci.

98voto

McDowell Points 62645

En supposant que vous voulez vous en tenir à l'API standard...

Vous pourriez utiliser un DOMImplémentationLS :

Document document = node.getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document
    .getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString(node);

Si la déclaration <?xml version="1.0" encoding="UTF-16"?> vous dérange, vous pouvez utiliser une balise transformateur à la place :

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
StringWriter buffer = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(node),
      new StreamResult(buffer));
String str = buffer.toString();

2voto

wierob Points 2395

Si vous disposez du schéma du XML ou si vous pouvez créer des liaisons JAXB pour celui-ci, vous pouvez utiliser JAXB Marshaller pour écrire dans System.out :

import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRootElement
public class BoundClass {

    @XmlAttribute
    private String test;

    @XmlElement
    private int x;

    public BoundClass() {}

    public BoundClass(String test) {
        this.test = test;
    }

    public static void main(String[] args) throws Exception {
        JAXBContext jxbc = JAXBContext.newInstance(BoundClass.class);
        Marshaller marshaller = jxbc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
        marshaller.marshal(new JAXBElement(new QName("root"),BoundClass.class,new Main("test")),System.out);
    }
}

0voto

Karl Points 1633

N'étant pas pris en charge par l'API JAXP standard, j'ai utilisé la bibliothèque JDom à cette fin. Elle dispose d'une fonction d'impression, d'options de formatage, etc. http://www.jdom.org/

0voto

Pooja Kansal Points 6049

Un code simple de 4 lignes pour obtenir String sans déclaration xml ( <?xml version="1.0" encoding="UTF-16"?> ) de org.w3c.dom.Element

DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0");
LSSerializer serializer = lsImpl.createLSSerializer();
serializer.getDomConfig().setParameter("xml-declaration", false); //by default its true, so set it to false to get String without xml-declaration
String str = serializer.writeToString(node);

0voto

yegor256 Points 21737

Essayez jcabi-xml avec une seule ligne :

String xml = new XMLDocument(element).toString();

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