質問

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を直接見ると、改行が保存されているように見えます。そのため、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の場合、CDATAガードをnode.getNodeValueに連結する必要があります。

空白文字を保持するために必ずしもCDATAを使用する必要はありません。 XML 仕様は、これらの文字のエンコード方法を指定します。

たとえば、新しいスペースを含む値を持つ要素がある場合、それをエンコードする必要があります

  &#xA;

キャリッジリターン:

 &#xD;

その他

編集:無関係なものをすべてカット

使用しているDOM実装を知りたいのですが、私が試したいくつかのJVM(Xerces implに同梱されています)のデフォルトの動作を反映していません。また、ドキュメントに含まれる改行文字にも興味があります。

CDATAが空白を保持する必要があるかどうかは不明です。多くの要因が関係していると思われます。 DTD /スキーマは空白の処理方法に影響しませんか?

xml:space =&quot; preserve&quot;を使用してみてください。属性。

xml:space = 'preserve'は違います。これは、「すべての空白」のみです。ノード。つまり、

の空白ノードが必要な場合
<this xml:space='preserve'> <has/>
<whitespace/>
</this>

ただし、これらの空白ノードは空白のみであることがわかります。

XercesでCDATAコンテンツの分離を可能にするイベントを生成するのに苦労しています。まだ解決策がありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top