Java'da org.w3c.dom.Element dosyasını string formatına nasıl çıkarabilirim?


90

org.w3c.dom.ElementMetoduma geçen bir nesne var . Alt düğümleri (tüm nesne grafiği) dahil olmak üzere tüm xml dizesini görmem gerekiyor. Yapabileceğim Elementbir xml format dizgisine dönüştürebilecek bir yöntem arıyorum System.out.println. Sadece println()'Element' nesnesi çalışmayacaktır çünkü toString()xml formatını çıkarmayacak ve onun alt düğümünden geçmeyecektir. Bunu yapmak için kendi yöntemimi yazmadan kolay bir yol var mı? Teşekkürler.

Yanıtlar:


156

Standart API'ye bağlı kalmak istediğinizi varsayarsak ...

DOMImplementationLS kullanabilirsiniz :

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"?> Bildirimi sizi rahatsız ediyorsa, bunun yerine bir transformatör kullanabilirsiniz :

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();

7
[Html: null] alıyorsanız ve HTML'yi bekliyorsanız çözüm budur. Google'ın umarım cevabı indeksleyebilmesi için bu yorum eklendi.
Donal Tobin

3
Yine de LSSerializer'ı kullanabilir ve "UTF-8" çıktısını alabilirsiniz. Bunun yerine LSOutput'u StringWriter ile kullanın ve kodlama türünü "UTF- * 8" olarak ayarlayın
ricosrealm

1
W3c

2
<?xml version="1.0" encoding="UTF-16"?>bildiri rahatsız ediyor ... bu satırı serializer .getDomConfig().setParameter("xml-declaration", false); ilk çözüme de ekleyebiliriz ....
Tarsem Singh

cevabınız için teşekkürler, bu gerçekten harika. Ancak bununla ilgili bir sorunum var, bazen eşleşen parçaların bazı etiketleri kaldırılıyor ve bunların metin içeriği yalnızca görüntüleniyor. Bu sorun için herhangi bir öneriniz var mı?
epcpu

16

String Xml-declaration ( <?xml version="1.0" encoding="UTF-16"?>) olmadan almak için basit 4 satırlı kodorg.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);

2

Standart JAXP API'de desteklenmiyor, bu amaçla JDom kitaplığını kullandım. Bir yazıcı işlevi, biçimlendirici seçenekleri vb. Vardır. Http://www.jdom.org/


Standart org.w3c.dom API'sinin amacı olmadığı için +1. Metin olarak XML bloklarıyla ilgileniyorsam, genellikle bunu bir normal ifade eşleşmesiyle metin olarak ayrıştırmaya çalışırım (eğer arama kriterleri kolayca bir normal ifade olarak gösteriliyorsa).
Cornel Masson

2

XML şemasına sahipseniz veya bunun için JAXB bağlamaları oluşturabiliyorsanız, System.out'a yazmak için JAXB Marshaller'ı kullanabilirsiniz:

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);
    }
}

2

Jcabi-xml'yi tek astarla deneyin :

String xml = new XMLDocument(element).toString();

Yeni jcabi-xml sürümleri Element as param desteklemiyor, sadece Düğüm / Dosya / Dize.
Ermintar

1

jcabi'de yapılan bu:

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();
}

ve benim için çalışıyor!


0

İle VTD-XML , imlecin geçebilir ve (ofset ve uzunluk onun ile belirtildiği gibi) segmenti almak için tek getElementFragment çağrısı yapmak ... Aşağıda bir örnek

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)));
        }
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.