Eu tenho um org.w3c.dom.Element
objeto passado em meu método. Preciso ver toda a string xml, incluindo seus nós filhos (todo o gráfico do objeto). Estou procurando um método que possa converter Element
em uma string de formato xml que eu possa System.out.println
usar. Apenas println()
no objeto 'Elemento' não funcionará porque toString()
não produzirá o formato xml e não passará por seu nó filho. Existe uma maneira fácil de fazer isso sem escrever meu próprio método? Obrigado.
90
<?xml version="1.0" encoding="UTF-16"?>
declaração incomoda ... também podemos adicionar esta linhaserializer .getDomConfig().setParameter("xml-declaration", false);
na primeira solução ....Código simples de 4 linhas para obter
String
sem declaração xml (<?xml version="1.0" encoding="UTF-16"?>
) deorg.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);
fonte
Não compatível com a API JAXP padrão, usei a biblioteca JDom para essa finalidade. Tem uma função de impressora, opções de formatador, etc. http://www.jdom.org/
fonte
Se você tiver o esquema do XML ou puder criar ligações JAXB para ele, poderá usar o JAXB Marshaller para gravar em 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); } }
fonte
Experimente jcabi-xml com um liner:
String xml = new XMLDocument(element).toString();
fonte
isso é o que é feito em 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(); }
E funciona para mim!
fonte
Com VTD-XML , você pode passar para o cursor e fazer uma única chamada getElementFragment para recuperar o segmento (conforme indicado por seu deslocamento e comprimento) ... Abaixo está um exemplo
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))); } } }
fonte