Mam org.w3c.dom.Element
obiekt przekazany do mojej metody. Muszę zobaczyć cały ciąg XML, w tym jego węzły podrzędne (cały wykres obiektu). Szukam metody, która może przekonwertować Element
na ciąg formatu xml, który mogę System.out.println
na. Po prostu obiekt println()
„Element” nie zadziała, ponieważ toString()
nie wyprowadzi formatu xml i nie przejdzie przez węzeł podrzędny. Czy istnieje łatwy sposób na zrobienie tego bez pisania własnej metody? Dzięki.
89
<?xml version="1.0" encoding="UTF-16"?>
deklaracja przeszkadza ... możemy też dodać tę linięserializer .getDomConfig().setParameter("xml-declaration", false);
w pierwszym rozwiązaniu ....Prosty czterowierszowy kod do pobrania
String
bez deklaracji xml (<?xml version="1.0" encoding="UTF-16"?>
) zorg.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);
źródło
Nieobsługiwany w standardowym JAXP API, wykorzystałem do tego bibliotekę JDom. Posiada funkcję drukarki, opcje formatyzatora itp. Http://www.jdom.org/
źródło
Jeśli masz schemat XML lub możesz w inny sposób utworzyć dla niego powiązania JAXB, możesz użyć JAXB Marshaller, aby napisać do 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); } }
źródło
Wypróbuj jcabi-xml z jedną linijką :
String xml = new XMLDocument(element).toString();
źródło
oto, co robi się w 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(); }
i to działa dla mnie!
źródło
Dzięki VTD-XML możesz przejść do kursora i wykonać pojedyncze wywołanie getElementFragment w celu pobrania segmentu (zgodnie z jego przesunięciem i długością) ... Poniżej znajduje się przykład
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))); } } }
źródło