كيفية الحفاظ على أسطر جديدة في CDATA عند إنشاء XML؟
سؤال
وأريد أن أكتب بعض النصوص التي تحتوي على أحرف المسافات البيضاء مثل 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 مواصفات تحديد كيفية ترميز هذه الأحرف.
وهكذا على سبيل المثال، إذا كان لديك عنصر مع القيمة التي تحتوي على مساحة جديدة يجب صياغته مع


والإرجاع:

وهكذا دواليك
وتحرير: قطع كل الاشياء غير ذي صلة
وأنا الغريب أن تعرف ما DOM التنفيذ الذي تستخدمه، لأنها لا تعكس السلوك الافتراضي من واحد في بضع JVMs حاولت (هم السفينة مع impl Xerces). أنا أيضا مهتمة في ما أحرف السطر الجديد لديها المستند.
وأنا لست متأكدا مما اذا كان سواء CDATA يجب الحفاظ على المسافات هي تعطى. وأظن أن هناك العديد من العوامل المشتركة. لا تدس / مخططات تؤثر على كيفية معالجة بيضاء؟
هل يمكن أن حاول استخدام أكس: الفضاء = "الحفاظ" سمة
.وXML: مساحة = 'المحافظة' ليس عليه. هذا هو فقط لعقد "كل المسافات". وهذا هو، إذا كنت ترغب في العقد بيضاء في
<this xml:space='preserve'> <has/>
<whitespace/>
</this>
ولكن نرى أن هذه العقد مسافة بيضاء هي فقط بيضاء.
ولقد كنت تناضل للحصول على Xerces لتوليد الأحداث السماح عزل محتوى CDATA كذلك. ليس لدي أي حل حتى الآن.