如何在Java中输出org.w3c.dom.Elementstring格式?

我有一个org.w3c.dom.Element对象传入我的方法。 我需要看到整个xmlstring,包括其子节点(整个对象图)。 我正在寻找一种方法,可以将Element转换为一个XML格式string,我可以System.out.println 。 只是'元素'对象上的println()将不起作用,因为toString()不会输出xml格式,不会通过它的子节点。 有没有一个简单的方法,而不写我自己的方法来做到这一点? 谢谢。

假设你想坚持使用标准的API …

你可以使用DOMImplementationLS :

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

如果<?xml version =“1.0”encoding =“UTF-16”?>声明困扰你,你可以使用一个变换器来代替:

 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(); 

简单的4行代码从org.w3c.dom.Element获取没有xml声明的 String<?xml version="1.0" encoding="UTF-16"?>

 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); 

如果您具有XML的模式,或者可以为其创buildJAXB绑定,则可以使用JAXB Marshaller写入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); } } 

在标准JAXP API中不支持,为此我使用了JDom库。 它有一个打印机function,格式化选项等http://www.jdom.org/

用一个class轮尝试jcabi-xml :

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

使用VTD-XML ,你可以传入游标,并进行单个getElementFragment调用来检索段(如其偏移量和长度所示)…下面是一个例子

 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))); } } } 

这是在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(); } 

它适用于我!