How to I output org.w3c.dom.Element to string format in java?

前端 未结 7 646
旧巷少年郎
旧巷少年郎 2020-11-27 13:01

I have an org.w3c.dom.Element object passed into my method. I need to see the whole xml string including its child nodes (the whole object graph). I am looking

相关标签:
7条回答
  • 2020-11-27 13:37

    this is what i s done in 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();
    }
    

    and it works for me!

    0 讨论(0)
  • 2020-11-27 13:41

    Try jcabi-xml with one liner:

    String xml = new XMLDocument(element).toString();
    
    0 讨论(0)
  • 2020-11-27 13:45

    Assuming you want to stick with the standard API...

    You could use a DOMImplementationLS:

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

    If the <?xml version="1.0" encoding="UTF-16"?> declaration bothers you, you could use a transformer instead:

    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();
    
    0 讨论(0)
  • 2020-11-27 13:48

    With VTD-XML, you can pass into the cursor and make a single getElementFragment call to retrieve the segment (as denoted by its offset and length)... Below is an example

    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)));
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-11-27 13:49

    If you have the schema of the XML or can otherwise create JAXB bindings for it, you could use the JAXB Marshaller to write to 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);
        }
    }
    
    0 讨论(0)
  • 2020-11-27 14:00

    Not supported in the standard JAXP API, I used the JDom library for this purpose. It has a printer function, formatter options etc. http://www.jdom.org/

    0 讨论(0)
提交回复
热议问题