मैं जावा में स्ट्रिंग प्रारूप के लिए org.w3c.dom.Element कैसे करें?


89

मेरे पास org.w3c.dom.Elementमेरी विधि में एक वस्तु है। मुझे इसकी चाइल्ड नोड्स (संपूर्ण ऑब्जेक्ट ग्राफ) सहित पूरे xml स्ट्रिंग को देखने की आवश्यकता है। मैं एक ऐसी विधि की तलाश में हूं जो Elementएक xml प्रारूप स्ट्रिंग में परिवर्तित हो सके जो मैं कर सकता हूं System.out.println। सिर्फ println()'एलिमेंट' ऑब्जेक्ट पर काम नहीं करेगा क्योंकि toString()xml प्रारूप आउटपुट नहीं करेगा और इसके बाल नोड के माध्यम से नहीं जाएगा। क्या ऐसा करने का अपना तरीका लिखे बिना एक आसान तरीका है? धन्यवाद।

जवाबों:


155

मान लें कि आप मानक API के साथ रहना चाहते हैं ...

आप एक DOMImplementationLS उपयोग कर सकते हैं :

Document document = node.getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document
    .getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString(node);

यदि <? Xml संस्करण = "1.0" एन्कोडिंग = "UTF-16"?> घोषणा आपको परेशान करती है, तो आप इसके बजाय एक ट्रांसफार्मर का उपयोग कर सकते हैं :

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] प्राप्त कर रहे हैं और HTML की अपेक्षा करेंगे। इस टिप्पणी को जोड़ा ताकि आशा है कि Google उत्तर को अनुक्रमित कर सके।
डोनाल्ड टोबिन

3
आप अभी भी LSSerializer और आउटपुट "UTF-8" का उपयोग कर सकते हैं। इसके बजाय स्ट्रिंगराइटर के साथ LSOutput का उपयोग करें और एन्कोडिंग प्रकार को "UTF- * 8" पर सेट करें
ricosrealm

1
W3c

2
<?xml version="1.0" encoding="UTF-16"?>घोषणा परेशान ... हम serializer .getDomConfig().setParameter("xml-declaration", false); पहले समाधान में भी इस पंक्ति को जोड़ सकते हैं ....
तरसेम सिंह

आपके उत्तर के लिए धन्यवाद, यह वास्तव में बहुत अच्छा है। लेकिन मुझे इसके साथ एक समस्या है, कभी-कभी मिलान किए गए भागों के कुछ टैग हटा दिए जाते हैं और उनमें से पाठ सामग्री को पूरी तरह से प्रदर्शित किया जाता है। क्या आपके पास इस समस्या के लिए कोई सुझाव है?
epcpu

16

String बिना xml-घोषणा ( <?xml version="1.0" encoding="UTF-16"?>) से प्राप्त करने के लिए सरल 4 लाइनों का कोड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);

2

मानक JAXP API में समर्थित नहीं है, मैंने इस उद्देश्य के लिए JDom लाइब्रेरी का उपयोग किया है। इसमें एक प्रिंटर फंक्शन, फॉर्मेटर विकल्प आदि हैं। http://www.jdom.org/


+1 यह मानक org.w3c.dom API का आशय नहीं है। यदि मुझे पाठ के रूप में XML के ब्लॉक में रुचि है, तो मैं आमतौर पर इसे एक रेगेक्स मैच के साथ पाठ के रूप में पार्स करने की कोशिश करता हूं (यदि खोज मानदंड आसानी से एक रेग्क्स के रूप में दर्शाया गया है)।
कॉर्नेल मासन

2

यदि आपके पास XML का स्कीमा है या अन्यथा इसके लिए JAXB बाइंडिंग बना सकते हैं, तो आप System.out को लिखने के लिए JAXB मार्शल का उपयोग कर सकते हैं:

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 आज़माएं :

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

Jcabi-xml के नए संस्करण तत्व को परम के रूप में समर्थन नहीं करते हैं, केवल नोड / फ़ाइल / स्ट्रिंग है।
इरमिंटार

1

यह जेसीबी में किया जाता है:

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

और यह मेरे लिए काम करता है!


0

साथ VTD-एक्सएमएल , आप कर्सर में पारित और खंड पुनः प्राप्त करने के (के रूप में अपनी से निरूपित किया ऑफसेट और लंबाई) एक एकल 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)));
        }
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.