J'ai un org.w3c.dom.Element
objet passé dans ma méthode. J'ai besoin de voir toute la chaîne xml, y compris ses nœuds enfants (le graphique d'objet entier). Je recherche une méthode qui peut convertir le Element
en une chaîne de format xml sur laquelle je peux System.out.println
. Juste println()
sur l'objet 'Element' ne fonctionnera pas car toString()
il ne produira pas le format xml et ne passera pas par son nœud enfant. Y a-t-il un moyen facile sans écrire ma propre méthode pour le faire? Merci.
89
<?xml version="1.0" encoding="UTF-16"?>
déclaration dérange ... nous pouvons également ajouter cette ligneserializer .getDomConfig().setParameter("xml-declaration", false);
dans la première solution ....Code simple de 4 lignes à obtenir
String
sans déclaration xml (<?xml version="1.0" encoding="UTF-16"?>
) deorg.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);
la source
Non pris en charge dans l'API JAXP standard, j'ai utilisé la bibliothèque JDom à cet effet. Il a une fonction imprimante, des options de formatage, etc. http://www.jdom.org/
la source
Si vous avez le schéma du XML ou pouvez autrement 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); } }
la source
Essayez jcabi-xml avec une seule doublure:
String xml = new XMLDocument(element).toString();
la source
voici ce qui se fait dans jcabi:
private String asString(Node node) { StringWriter writer = new StringWriter(); try { Transformer trans = TransformerFactory.newInstance().newTransformer(); // @checkstyle MultipleStringLiterals (1 line) trans.setOutputProperty(OutputKeys.INDENT, "yes"); trans.setOutputProperty(OutputKeys.VERSION, "1.0"); if (!(node instanceof Document)) { trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); } trans.transform(new DOMSource(node), new StreamResult(writer)); } catch (final TransformerConfigurationException ex) { throw new IllegalStateException(ex); } catch (final TransformerException ex) { throw new IllegalArgumentException(ex); } return writer.toString(); }
Et cela fonctionne pour moi!
la source
Avec VTD-XML , vous pouvez passer dans le curseur et faire un seul appel à getElementFragment pour récupérer le segment (comme indiqué par son décalage et sa longueur) ... Ci-dessous un exemple
import com.ximpleware.*; public class concatTest{ public static void main(String s1[]) throws Exception { VTDGen vg= new VTDGen(); String s = "<users><user><firstName>some </firstName><lastName> one</lastName></user></users>"; vg.setDoc(s.getBytes()); vg.parse(false); VTDNav vn = vg.getNav(); AutoPilot ap = new AutoPilot(vn); ap.selectXPath("/users/user/firstName"); int i=ap.evalXPath(); if (i!=1){ long l= vn.getElementFragment(); System.out.println(" the segment is "+ vn.toString((int)l,(int)(l>>32))); } } }
la source