2011-12-22 10 views
6

XML文書を編集(挿入)して保存するためにLINQでXDocumentを使用しています。 doc.Save前xdocument saveタグ内に空白を保存する

XDocument doc = XDocument.Load("c:\\sample.xml", LoadOptions.PreserveWhitespace); 
doc.Save("c:\\sample.xml",SaveOptions.DisableFormatting) 

sample.xmlに:あなたが見ることができるようにdoc.Save

<ELEMENT ATTRIB1="attrib1" ATTRIB2="attrib2"> 
    value 
</ELEMENT> 

は、ATTRIB1とシングル後の二重のスペースがある後

<ELEMENT ATTRIB1="attrib1" ATTRIB2="attrib2" > 
    value 
</ELEMENT> 

sample.xmlに元の文書のATTRIB2の後の空白。 しかし、doc.saveを呼び出すと、これらのスペースはlinqによって削除されています。

タグ内の空白を保存するにはどうすればよいですか?

+1

なぜあなたはそれを必要としますか? – ChrisWue

+7

これは必須です...... – Rocky

答えて

11

LoadOptions.PreserveWhitespaceSaveOptions.DisableFormattingは、インデントとテキストノードの内容に関して空白を処理する方法についてXDocumentに指示するだけです。属性などを正規化します。

デフォルトのXmlTextWriterで動作する構成が見つからない場合は、必要な処理を行うように構成されたXmlWriterを指定するオーバーロードを使用することもできます。独自のXmlWriterをいつでも作成できます。

1

これらは「重要ではない空白」であり、の時点で削除されます。 XML。保存を呼び出すときには、属性間の間隔に関する情報はありません。 (厳密に言えば、XMLの意味がないので属性の順序も知られていないことに注意してください)。

XML標準で直接サポートされていない方法でXMLを読み書きする場合は、カスタム処理を行う必要があります。要件に応じて、オリジナルのXMLから情報を実際に保持したい場合は、カスタムXmlWriterで十分です(つまり、2つの空白を持つ属性を均等に分離したい場合)か、スタック全体(リーダー/ライター/ノード)を構築する必要がありますXMLではなく、テキストとして)。

+0

これは正しくないようです。私はそれが保存中に再フォーマットされていると信じています。それが本当であっても、文書は文字通り嘘です。 'LoadOptions.PreserveWhitespace'のドキュメンテーションが"解析中に余分な空白を保持する "と書かれていることに気づくでしょう。 'SaveOptions.DisableFormatting'のドキュメンテーションは"シリアライズ中に重要でないすべての空白を残してください "と書かれています。 – BrainSlugs83

+0

また、標準でサポートされていないこのXMLに関するコメントは、標準でサポートされていない場合は無効です。有効なXMLではないため、解析時に例外がスローされます。 – BrainSlugs83

+0

@ BrainSlugs83 - XMLの観点から、重要な/重要でない空白は、要素の内容(属性がある開始タグではない)内でのみ考慮されることに注意してください - 属性間の2つのスペースは「空白」とみなされるのではなく、 。ですから、なぜPreserveWhitespaceが属性間のスペースの扱いに影響するべきなのか、私は分かりません。より正式な定義については、http://www.w3.org/TR/2000/REC-xml-20001006#sec-white-spaceを参照してください。 –

関連する問題