كيفية الحفاظ على أسطر جديدة في CDATA عند إنشاء XML؟

StackOverflow https://stackoverflow.com/questions/1216875

سؤال

وأريد أن أكتب بعض النصوص التي تحتوي على أحرف المسافات البيضاء مثل 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.

وكيف يمكنني الحفاظ على أسطر جديدة؟

وشكرا!

هل كانت مفيدة؟

المحلول

وأنا لا أعرف كيف تحليل وكتابة المستند، ولكن هنا مثال كود تعزيز استنادا لك:

// 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 للقيام بذلك ( نرى هنا ). وكما هو متوقع الإخراج، مع فواصل السطر:

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

نصائح أخرى

وتحتاج إلى التحقق من نوع كل عقدة باستخدام node.getNodeType (). إذا كان النوع CDATA_SECTION_NODE، تحتاج إلى CONCAT الحراس CDATA إلى node.getNodeValue.

وليس لديك بالضرورة لاستخدام CDATA للحفاظ على المسافات البيضاء. وXML مواصفات تحديد كيفية ترميز هذه الأحرف.

وهكذا على سبيل المثال، إذا كان لديك عنصر مع القيمة التي تحتوي على مساحة جديدة يجب صياغته مع

  &#xA;

والإرجاع:

 &#xD;

وهكذا دواليك

وتحرير: قطع كل الاشياء غير ذي صلة

وأنا الغريب أن تعرف ما DOM التنفيذ الذي تستخدمه، لأنها لا تعكس السلوك الافتراضي من واحد في بضع JVMs حاولت (هم السفينة مع impl Xerces). أنا أيضا مهتمة في ما أحرف السطر الجديد لديها المستند.

وأنا لست متأكدا مما اذا كان سواء CDATA يجب الحفاظ على المسافات هي تعطى. وأظن أن هناك العديد من العوامل المشتركة. لا تدس / مخططات تؤثر على كيفية معالجة بيضاء؟

هل يمكن أن حاول استخدام أكس: الفضاء = "الحفاظ" سمة

.

وXML: مساحة = 'المحافظة' ليس عليه. هذا هو فقط لعقد "كل المسافات". وهذا هو، إذا كنت ترغب في العقد بيضاء في

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

ولكن نرى أن هذه العقد مسافة بيضاء هي فقط بيضاء.

ولقد كنت تناضل للحصول على Xerces لتوليد الأحداث السماح عزل محتوى CDATA كذلك. ليس لدي أي حل حتى الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top