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.
Réponses
Trop de publicités?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();
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);
}
}
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/
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);