2011-12-22 61 views
6

我在LINQ中使用XDocument來編輯(插入)並保存xml文檔。 doc.Save前xdocument保存標記內的空白空間

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

sample.xml中:

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

sample.xml中後doc.Save

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

正如你所看到的,有ATTRIB1和單後雙空間原始文件中的ATTRIB2之後的空格。 但是當我調用doc.save時,這些空格已被linq刪除。

如何保留標籤內的空格?

+1

你爲什麼要這麼做? – ChrisWue 2011-12-22 07:02:56

+7

這是要求...... – Rocky 2011-12-23 08:03:37

回答

11

我認爲LoadOptions.PreserveWhitespaceSaveOptions.DisableFormatting只指示XDocument如何處理縮進和文本節點內容的空白。它仍然會標準化屬性等。

您可能希望在指定一個配置爲執行所需操作的XmlWriter的情況下使用重載,並且如果找不到使用默認XmlTextWriter的配置,你總是可以創建自己的XmlWriter。

1

這些是「不顯着的空格」,並且在讀取 XML時被刪除。在您調用保存時,沒有關於屬性間距的信息。 (請注意,嚴格來說,即使XML的屬性順序不可知,因爲它在XML中沒有意義)。

如果您想以XML標準不直接支持的方式讀取/寫入XML,則需要提供一些自定義處理。根據需要,自定義XmlWriter可能已經足夠了(例如,如果您希望統一使用2個空格分隔屬性),或者如果您想實際保留原始XML中的信息(您可以自己構建整個堆棧(讀者/作者/節點)作爲文本,而不是XML)。

+0

這似乎不正確。我相信它在保存期間被重新格式化,而不是被讀取。即使這是真的,那麼這個文檔就是在說謊。您會注意到'LoadOptions.PreserveWhitespace'的文檔中顯示「解析時保留無意義的空白區」。並且'SaveOptions.DisableFormatting'的文檔中的內容是「序列化時保留所有無意義的空白區域」。 – BrainSlugs83 2015-03-19 23:17:34

+0

此標準不支持該XML的評論不合適,如果它不被標準支持,它不會是有效的XML,並且在解析時拋出異常。 – BrainSlugs83 2015-03-19 23:23:19

+0

@ BrainSlugs83 - 請注意,從XML的角度來看,重要/不重要的空白僅在元素內容(不在屬性所在的開始標記中)考慮 - 因此屬性之間的兩個空格不被視爲「空白」,而僅僅是屬性的語法分隔符。所以我不確定你爲什麼認爲'PreserveWhitespace'應該影響屬性間的空間處理方式。查看http://www.w3.org/TR/2000/REC-xml-20001006#sec-white-space以獲得更正式的定義。 – 2015-03-20 00:27:51