如何在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(); }
它适用于我!