В org.w3c.dom.Element
мой метод передан объект. Мне нужно увидеть всю строку xml, включая ее дочерние узлы (весь граф объекта). Я ищу метод, который может преобразовать Element
в строку формата xml, с которой я могу System.out.println
. Просто println()
объект «Элемент» не будет работать, потому toString()
что не будет выводить формат xml и не будет проходить через его дочерний узел. Есть ли простой способ сделать это без написания собственного метода? Спасибо.
89
<?xml version="1.0" encoding="UTF-16"?>
декларация беспокоит ... мы также можем добавить эту строкуserializer .getDomConfig().setParameter("xml-declaration", false);
в первое решение ....Простой 4-строчный код
String
без объявления xml (<?xml version="1.0" encoding="UTF-16"?>
) изorg.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);
источник
Не поддерживается в стандартном JAXP API, я использовал для этой цели библиотеку JDom. Он имеет функцию принтера, параметры форматирования и т. Д. Http://www.jdom.org/
источник
Если у вас есть схема XML или вы можете иным образом создать для нее привязки JAXB, вы можете использовать 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); } }
источник
Попробуйте jcabi-xml с одним вкладышем:
String xml = new XMLDocument(element).toString();
источник
вот что сделано в 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(); }
и у меня это работает!
источник
С помощью 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))); } } }
источник