2009-01-27 16 views
7

की XML सामग्री प्राप्त करें I W3C DOM का उपयोग कर जावा में एक XML फ़ाइल पार्स कर रहा हूं। मैं एक विशिष्ट समस्या पर फंस गया हूं, मैं यह नहीं समझ सकता कि नोड के पूरे आंतरिक एक्सएमएल को कैसे प्राप्त किया जाए।जावा/डोम: नोड

नोड कि तरह लग रहा है:

<td><b>this</b> is a <b>test</b></td>

क्या समारोह मुझे लगता है कि प्राप्त करने के लिए उपयोग करने के लिए है: आप के रूप में अपने < ख > नोड का उपयोग कर बदलना/xslt एपीआई का उपयोग करने के लिए है

"<b>this</b> is a <b>test</b>"

+0

[अतः एक नोड के भीतर Xml पाने के लिए मदद मिल सकती है पर इस पोस्ट] [1] [बनाने में कामयाब 1]: http://stackoverflow.com/questions/7910474/how-to-get-node-contents-from-jdom – JeeZ

उत्तर

3

नोड को बदलने के लिए और परिणाम को एक नए StreamResult (नया स्ट्रिंगवाइटर()) में डाल दिया; । how-to-pretty-print-xml-from-java

0

एर ... आप टूस्ट्रिंग() को भी कॉल कर सकते हैं और शुरुआत या अंत टैग को मैन्युअल रूप से या रीगेक्सप्स का उपयोग करके बंद कर सकते हैं।

संपादित करें: toString() जो मैंने अपेक्षित नहीं किया है। O'Reilly Java & XML book को खींचकर जावा डोम के लोड और सेव मॉड्यूल के बारे में बात करें।

विशेष रूप से LSSerializer देखें जो बहुत ही आशाजनक लग रहा है। आप या तो लिखने के लिए लिख सकते हैं टॉस्ट्रिंग (नोड) और शुरुआत और अंत टैग काट लें, जैसा कि मैंने सुझाव दिया है, या शीर्ष नोड टैग मुद्रित करने के लिए LSSerializerFilter का उपयोग करने का प्रयास करें (सुनिश्चित नहीं है कि यह काम करेगा या नहीं; मैं मानता हूं कि मैंने कभी भी LSSerializer का उपयोग नहीं किया है ।)

ओ रेली किताब पढ़ना कुछ इस तरह कर रही है इंगित करता है:

DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); 
DOMImplementationLS lsImpl = 
    (DOMImplementationLS)registry.getDOMImplementation("LS"); 
LSSerializer serializer = lsImpl.createLSSerializer(); 
String nodeString = serializer.writeToString(node); 
+0

नहीं? मेरे टीडी-नोड के .toString() के परिणामस्वरूप "[बी: नल]" –

+0

हम्म, मुझे लगता है कि मुझे जावास्क्रिप्ट + ई 4 एक्स के साथ भ्रमित हो गया है। मेरा मतलब था कि फ़ंक्शन को कॉल करें जो केवल आउटपुट उत्पन्न करता है, फिर शुरुआत/अंत टैग हटाएं। –

0

node.getTextContent();

आपको व्हाइट्सजेड को सही तरीके से संभालने के लिए, अन्य कारणों से, नोड्स को संभालने के लिए Dom4J का JDom का उपयोग करना चाहिए।

0

अनावश्यक टैग शायद इस तरह के कोड इस्तेमाल किया जा सकता निकालने के लिए:

DOMConfiguration config = serializer.getDomConfig(); config.set पैरामीटर ("कैनोनिक-फॉर्म", सत्य);

लेकिन यह हमेशा काम नहीं करेगा, क्योंकि "विहित फार्म = सच" वैकल्पिक है

4

मैं जानता हूँ कि यह बहुत पहले कहा गया था लेकिन खोज अगले व्यक्ति के लिए (मुझे आज था), इस JDOM साथ काम करता है:

JDOMXPath xpath = new JDOMXPath("/td"); 
String innerXml = (new XMLOutputter()).outputString(xpath.selectNodes(document)); 

यह आउटपुटस्ट्रिंग में सभी बाल नोड्स की एक सूची पास करता है, जो क्रम में उन्हें क्रमबद्ध करेगा।

1

आप इसके बारे में क्या कहते हैं? मैं एंड्रॉयड पर एक ही समस्या आज की थी, लेकिन मैं साधारण "serializator"

private String innerXml(Node node){ 
     String s = ""; 
     NodeList childs = node.getChildNodes(); 
     for(int i = 0;i<childs.getLength();i++){ 
      s+= serializeNode(childs.item(i)); 
     } 
     return s; 
    } 

    private String serializeNode(Node node){ 
     String s = ""; 
     if(node.getNodeName().equals("#text")) return node.getTextContent(); 
     s+= "<" + node.getNodeName()+" "; 
     NamedNodeMap attributes = node.getAttributes(); 
     if(attributes!= null){ 
      for(int i = 0;i<attributes.getLength();i++){ 
       s+=attributes.item(i).getNodeName()+"=\""+attributes.item(i).getNodeValue()+"\""; 
      } 
     } 
     NodeList childs = node.getChildNodes(); 
     if(childs == null || childs.getLength() == 0){ 
      s+= "/>"; 
      return s; 
     } 
     s+=">"; 
     for(int i = 0;i<childs.getLength();i++) 
      s+=serializeNode(childs.item(i)); 
     s+= "</"+node.getNodeName()+">"; 
     return s; 
    }