Saya memiliki org.w3c.dom.Element
objek yang dimasukkan ke dalam metode saya. Saya perlu melihat seluruh string xml termasuk node anaknya (seluruh grafik objek). Saya mencari metode yang dapat mengubah Element
menjadi string format xml yang saya bisa System.out.println
. Hanya println()
pada objek 'Elemen' tidak akan berfungsi karena toString()
tidak akan menampilkan format xml dan tidak akan melalui simpul anaknya. Apakah ada cara mudah tanpa menulis metode saya sendiri untuk melakukan itu? Terima kasih.
90
<?xml version="1.0" encoding="UTF-16"?>
deklarasi mengganggu ... kita juga dapat menambahkan baris iniserializer .getDomConfig().setParameter("xml-declaration", false);
di solusi pertama ....Kode 4 baris sederhana untuk didapatkan
String
tanpa xml-declaration (<?xml version="1.0" encoding="UTF-16"?>
) dariorg.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);
sumber
Tidak didukung dalam JAXP API standar, saya menggunakan perpustakaan JDom untuk tujuan ini. Ini memiliki fungsi printer, opsi formatter dll. Http://www.jdom.org/
sumber
Jika Anda memiliki skema XML atau sebaliknya dapat membuat JAXB binding untuknya, Anda dapat menggunakan JAXB Marshaller untuk menulis ke 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); } }
sumber
Coba jcabi-xml dengan satu liner:
String xml = new XMLDocument(element).toString();
sumber
inilah yang dilakukan di 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(); }
dan itu berhasil untuk saya!
sumber
Dengan VTD-XML , Anda dapat meneruskan ke kursor dan membuat satu panggilan getElementFragment untuk mengambil segmen (sebagaimana dilambangkan dengan offset dan panjangnya) ... Di bawah ini adalah contohnya
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))); } } }
sumber