2009-08-01 18 views
6

मैं कुछ पाठ कि इस तरह के newline और tab एक xml फ़ाइल तो मैंएक्सएमएल उत्पन्न करते समय सीडीएटीए में नई लाइनों को कैसे संरक्षित किया जाए?

Element element = xmldoc.createElement("TestElement"); 
element.appendChild(xmldoc.createCDATASection(somestring)); 

का उपयोग लेकिन जब मैं

Node vs = xmldoc.getElementsByTagName("TestElement").item(0); 
String x = vs.getFirstChild().getNodeValue(); 

उसका उपयोग करके इस वापस पढ़ें मैं एक स्ट्रिंग पाने में के रूप में खाली स्थान के वर्ण हैं लिखना चाहते हैं इसमें अब कोई नई लाइन नहीं है।
जब मैं सीधे डिस्क पर एक्सएमएल में दिखता हूं, तो न्यूलाइन संरक्षित प्रतीत होती है। इसलिए समस्या तब होती है जब xml फ़ाइल में पढ़ना होता है।

मैं न्यूलाइन कैसे संरक्षित कर सकता हूं?

धन्यवाद!

+2

क्या आप एक और पूरा कोड उदाहरण पोस्ट कर सकते हैं? – skaffman

+0

यह एक तत्व है। मैं जल्द ही और कोड पोस्ट करूंगा। – clamp

+0

जब आपको 'x' का मान मिलता है, तो यह 'somestring' के बराबर है न्यूलाइन को घटाता है? – akf

उत्तर

5

मैं डॉन यह नहीं पता कि आप अपना दस्तावेज़ कैसे पार्स और लिखते हैं, लेकिन यहां आपके द्वारा आधारित एक उन्नत कोड उदाहरण है:

// creating the document in-memory               
Document xmldoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 

Element element = xmldoc.createElement("TestElement");          
xmldoc.appendChild(element);                
element.appendChild(xmldoc.createCDATASection("first line\nsecond line\n"));    

// serializing the xml to a string               
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();    

DOMImplementationLS impl =                 
    (DOMImplementationLS)registry.getDOMImplementation("LS");        

LSSerializer writer = impl.createLSSerializer();           
String str = writer.writeToString(xmldoc);             

// printing the xml for verification of whitespace in cdata        
System.out.println("--- XML ---");               
System.out.println(str);                 

// de-serializing the xml from the string             
final Charset charset = Charset.forName("utf-16");           
final ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes(charset));  
Document xmldoc2 = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(input); 

Node vs = xmldoc2.getElementsByTagName("TestElement").item(0);       
final Node child = vs.getFirstChild();              
String x = child.getNodeValue();               

// print the value, yay!                 
System.out.println("--- Node Text ---");             
System.out.println(x);                  

LSSerializer का उपयोग कर क्रमबद्धता W3C तरीका है (see here)। आउटपुट अपेक्षाकृत है, लाइन विभाजक के साथ:

--- XML --- 
<?xml version="1.0" encoding="UTF-16"?> 
<TestElement><![CDATA[first line 
second line ]]></TestElement> 
--- Node Text --- 
first line 
second line 
+1

धन्यवाद, मैंने कोशिश की लेकिन यह मेरे लिए काम नहीं करता है। जबकि मैं डिस्क पर xmlfile में लाइनब्रैक देख सकता हूं, एक बार जब मैं उन्हें इस कोड के साथ वापस पढ़ता हूं, तो वे चले जाते हैं। शायद मेरा लाइनबैक चरित्र खराब है। मैं कैसे पता लगा सकता हूं, यह कौन सा है? – clamp

+0

मैंने जो आउटपुट दिखाया है वह मेरे द्वारा पोस्ट किए गए कोड उदाहरण की अपनी मशीन से वास्तविक आउटपुट है। क्या आपने सुझाए गए कोड के साथ टेक्स्ट लिखने का प्रयास किया था? या केवल मेरे कोड का उपयोग करके इसे पढ़ने के लिए? इसके अलावा, आपकी फ़ाइल का एन्कोडिंग क्या है (आप देख सकते हैं कि मेरे उदाहरण में, एन्कोडिंग यूटीएफ -16 है)। मुझे एक ही एन्कोडिंग का उपयोग न करने में एक ही समस्या थी, और मैंने इसे इस्तेमाल किए गए वास्तविक एन्कोडिंग के साथ Charset.forName() का उपयोग कर तय किया। –

+0

हां, मैंने आपके मामले में अपना वास्तविक कोड आजमाया है। मैं स्ट्रिंग आउटपुट करने के लिए बिल्कुल वही कोड इस्तेमाल किया। लेकिन इसमें सफेद जगह नहीं है। मैं जिस एन्कोडिंग का उपयोग करता हूं वह एन्कोडिंग = "आईएसओ -885 9 -1" है, मैं यूटीएफ -16 – clamp

0

संपादित करें:, सभी अप्रासंगिक सामान

मैं जानता हूँ कि तुम क्या डोम कार्यान्वयन का उपयोग कर रहे करने के लिए उत्सुक हूँ कटौती क्योंकि यह JVMs के एक जोड़े में से एक के डिफ़ॉल्ट व्यवहार को दिखाई न दे रहा की कोशिश की है (वे एक ज़ेरेस इंप के साथ जहाज)। मुझे आपकी रुचि है कि आपके दस्तावेज़ में कौन से न्यूलाइन अक्षर हैं।

मुझे यकीन नहीं है कि क्या सीडीएटीए को व्हाइटस्पेस को संरक्षित किया जाना चाहिए या नहीं। मुझे संदेह है कि इसमें कई कारक शामिल हैं। डीटीडी/स्कीमा प्रभावित नहीं करते हैं कि व्हाइटस्पेस को कैसे संसाधित किया जाता है?

आप xml का उपयोग करने का प्रयास कर सकते हैं: space = "preserve" विशेषता।

+0

हाँ मुझे पता है, यही कारण है कि मैं getFirstchild() – clamp

+0

उह का उपयोग करता हूं! याद किया कि! – McDowell

+0

धन्यवाद, मुझे वास्तव में उस XML को कहाँ जोड़ना चाहिए: space = "संरक्षित" विशेषता? उस नोड में जिसमें टेक्स्ट या xml रूट है? – clamp

2

आपको node.getNodeType() का उपयोग करके प्रत्येक नोड के प्रकार की जांच करने की आवश्यकता है। यदि प्रकार CDATA_SECTION_NODE है, तो आपको सीडीएटीए गार्ड को node.getNodeValue से जोड़ना होगा।

+0

हां, नोड का प्रकार सीडीएटीए है। लेकिन कॉन्सैट सीडीएटीए गार्ड के साथ आपका क्या मतलब है? – clamp

2

आपको सफेद स्पेस वर्णों को संरक्षित करने के लिए सीडीएटीए का उपयोग करने की आवश्यकता नहीं है। एक्सएमएल specification निर्दिष्ट करें कि इन वर्णों को एन्कोड कैसे करें।

इसलिए उदाहरण के लिए, यदि आप मूल्य है कि नए स्थान शामिल हैं के साथ एक तत्व है कि आप इसे

&#xA; 

कैरिज वापसी के साथ सांकेतिक शब्दों में बदलना चाहिए:

&#xD; 

और इसके आगे

+0

धन्यवाद, लेकिन क्या इसे एन्कोड किए बिना कोई तरीका है? ताकि मैं xml फ़ाइल में स्वरूपित पाठ स्वयं देख सकूं? – clamp

0

xml: space = 'preserve' यह नहीं है। यह केवल "सभी सफेद जगह" नोड्स के लिए है। यही कारण है, अगर आप

<this xml:space='preserve'> <has/> 
<whitespace/> 
</this> 

में खाली स्थान के नोड्स चाहते लेकिन देखना है कि उन खाली स्थान के नोड्स केवल रिक्त स्थान हैं।

मैं जेरेसेस को सीडीएटीए सामग्री के अलगाव की इजाजत देने की घटनाओं को उत्पन्न करने के लिए संघर्ष कर रहा हूं। मेरे पास अभी तक कोई समाधान नहीं है।

संबंधित मुद्दे