2010-07-21 15 views
21

में स्ट्रिंग के रूप में एक नोड के भीतर एक्सएमएल जाओ मैं एक एक्सएमएल org.w3c.dom.Node है कि इस तरह दिखता है:जावा डोम

<variable name="variableName"> 
    <br /><strong>foo</strong> bar 
</variable> 

मैं एक स्ट्रिंग के रूप में <br /><strong>foo</strong> bar हिस्सा कैसे प्राप्त करूं?

उत्तर

6

इसके लिए org.w3c.dom.Node पर कोई आसान तरीका नहीं है। getTextContent() प्रत्येक बच्चे नोड का एक साथ संयोजित पाठ देता है। getNodeValue() आपको वर्तमान नोड का टेक्स्ट देगा यदि यह एक विशेषता, सीडीएटीए या टेक्स्ट नोड है। तो आपको स्ट्रिंग बनाने के लिए getChildNodes(), getNodeName() और getNodeValue() के संयोजन का उपयोग करके नोड को क्रमबद्ध करने की आवश्यकता होगी।

आप इसे मौजूद विभिन्न एक्सएमएल धारावाहिक पुस्तकालयों में से एक के साथ भी कर सकते हैं। एक्सस्ट्रीम या यहां तक ​​कि जेएक्सबी भी है। इस पर XML serialization in Java?

36

समान समस्या में चर्चा की गई है।

public String innerXml(Node node) { 
    DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0"); 
    LSSerializer lsSerializer = lsImpl.createLSSerializer(); 
    NodeList childNodes = node.getChildNodes(); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < childNodes.getLength(); i++) { 
     sb.append(lsSerializer.writeToString(childNodes.item(i))); 
    } 
    return sb.toString(); 
} 
+0

धन्यवाद, वास्तव में क्या मैं – yossi

+0

जरूरत इस विधि स्ट्रिंग के सामने XML परिभाषा टैग जोड़ने रहता है ... वहाँ को रोकने के लिए किसी भी तरह से है कि, इसके बाद इसे तुरंत छोड़ने के अलावा? – Nyerguds

+16

मैंने इसे हल किया।इसका समाधान लाइन 'lsSerializer.getDomConfig() को सेट करना है। सेट पैरामीटर ("xml-declaration", false); ' – Nyerguds

2

आप बाहरी पुस्तकालयों का सहारा लेना चाहते हैं न, तो निम्न समाधान काम में आ सकता है: इसे हल करने मैं इस सहायक समारोह लिखा था। आप एक नोड "है, तो" और आप पेरेंट तत्व के बच्चों के निकालना चाहते हैं आगे बढ़ना इस प्रकार है:

StringBuilder resultBuilder = new StringBuilder(); 
    // Get all children of the given parent node 
    NodeList children = parent.getChildNodes(); 
    try { 

     // Set up the output transformer 
     TransformerFactory transfac = TransformerFactory.newInstance(); 
     Transformer trans = transfac.newTransformer(); 
     trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     trans.setOutputProperty(OutputKeys.INDENT, "yes"); 
     StringWriter stringWriter = new StringWriter(); 
     StreamResult streamResult = new StreamResult(stringWriter); 

     for (int index = 0; index < children.getLength(); index++) { 
      Node child = children.item(index); 

      // Print the DOM node 
      DOMSource source = new DOMSource(child); 
      trans.transform(source, streamResult); 
      // Append child to end result 
      resultBuilder.append(stringWriter.toString()); 
     } 
    } catch (TransformerException e) { 
     //Errro handling goes here 
    } 
    return resultBuilder.toString(); 
4

आप jOOX का उपयोग कर रहे हैं, तो आप एक jquery तरह वाक्य रचना और सिर्फ कॉल में अपने नोड लपेट कर सकते हैं इस पर toString():

$(node).toString(); 

यह आंतरिक रूप से एक पहचान-ट्रांसफार्मर का उपयोग करता है, इस तरह:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
Source source = new DOMSource(element); 
Result target = new StreamResult(out); 
transformer.transform(source, target); 
return out.toString(); 
0

बिल्डिंग लुकास एदेर के समाधान के शीर्ष पर, हम कर सकते हैं नीचे

public static String innerXml(Node node,String tag){ 
     String xmlstring = toString(node); 
     xmlstring = xmlstring.replaceFirst("<[/]?"+tag+">",""); 
     return xmlstring;  

}

public static String toString(Node node){  
    String xmlString = ""; 
    Transformer transformer; 
    try { 
     transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     //transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     StreamResult result = new StreamResult(new StringWriter()); 

     xmlString = nodeToStream(node, transformer, result); 

    } catch (TransformerConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TransformerFactoryConfigurationError e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TransformerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }catch (Exception ex){ 
     ex.printStackTrace(); 
    } 

    return xmlString;    
} 

पूर्व के रूप में .NET में तरह innerXml निकालें:

If Node name points to xml with string representation "<Name><em>Chris</em>tian<em>Bale</em></Name>" 
String innerXml = innerXml(name,"Name"); //returns "<em>Chris</em>tian<em>Bale</em>" 
1

मैं पिछले जवाब यह है कि विधि 'nodeToStream()' अपरिभाषित है के साथ समस्या थी; इसलिए, मेरा संस्करण यहां:

public static String toString(Node node){ 
    String xmlString = ""; 
    try { 
     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     //transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

     Source source = new DOMSource(node); 

     StringWriter sw = new StringWriter(); 
     StreamResult result = new StreamResult(sw); 

     transformer.transform(source, result); 
     xmlString = sw.toString(); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return xmlString; 
} 
3

एंड्री एम के उत्तर पर विस्तार करते हुए, मुझे पूर्ण डोम दस्तावेज़ प्राप्त करने के लिए कोड को थोड़ा संशोधित करना पड़ा। यदि आप केवल

NodeList childNodes = node.getChildNodes(); 

का उपयोग मेरे लिए मूल तत्व शामिल नहीं था। (और पूर्ण .xml दस्तावेज़ प्राप्त) मूल तत्व शामिल करने के लिए मैं का इस्तेमाल किया: यहाँ

public String innerXml(Node node) { 
    DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0"); 
    LSSerializer lsSerializer = lsImpl.createLSSerializer(); 
    lsSerializer.getDomConfig().setParameter("xml-declaration", false); 
    StringBuilder sb = new StringBuilder(); 
    sb.append(lsSerializer.writeToString(node)); 
    return sb.toString(); 
} 
0

एक org.w3c.dom.Node की सामग्री को निकालने के लिए एक वैकल्पिक समाधान है। यह समाधान भी काम करता है अगर नोड सामग्री नहीं एक्सएमएल टैग शामिल हैं:

private static String innerXml(Node node) throws TransformerFactoryConfigurationError, TransformerException { 
    StringWriter writer = new StringWriter(); 
    String xml = null; 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    transformer.transform(new DOMSource(node), new StreamResult(writer)); 
    // now remove the outer tag.... 
    xml = writer.toString(); 
    xml = xml.substring(xml.indexOf(">") + 1, xml.lastIndexOf("</")); 
    return xml; 
} 
संबंधित मुद्दे