2011-12-14 20 views
5

我想讀取一個XML配置文件,做一些調整(找到並刪除或添加一個元素)並再次保存。我想這編輯是作爲非侵入的可能,因爲該文件將源控制之下,我不想不合理的更改導致合併衝突等,這大約是我的本錢:如何使用XDocument保留所有XML格式?

XDocument configDoc = XDocument.Load(fileName, LoadOptions.PreserveWhitespace); 
// modifications to configDoc here 
configDoc.Save(fileName, SaveOptions.DisableFormatting); 

還有,這裏彈出的幾個問題:

  1. encoding="utf-8"被添加到XML聲明。
  2. <tag attr="val"/>變爲<tag attr="val" />
  3. 爲了便於閱讀而分散在不同行上的屬性被全部推送到一行。

有什麼辦法可以減少對XDocument的干擾,或者我將不得不嘗試進行字符串編輯以獲得我想要的內容嗎?

回答

4

LINQ to XML對象模型不存儲被分析的元素是否被標記爲<foo/><foo />,所以當保存返回這些信息時會丟失。如果你想確保某種格式,那麼你可以擴展一個XmlWriter實現並覆蓋它的http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writeendelement.aspx,但這樣你也不會保留輸入格式,相反你會寫出任何空元素作爲<foo/>或者你在你的方法中實現的任何格式。

有加載文件

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Example</title> 
    </head> 
    <body> 
    <h1>Example</h1> 
    </body> 
</html> 

並保存回結果時可能發生,比如其他的變化是

<xhtml:html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <xhtml:head> 
    <xhtml:title>Example</xhtml:title> 
    </xhtml:head> 
    <xhtml:body> 
    <xhtml:h1>Example</xhtml:h1> 
    </xhtml:body> 
</xhtml:html> 

,所以不要指望標記信息被保存時使用XDocument/XElement加載/保存。

+1

的文檔的頁眉聲明所以我想簡單的答案是「你不能」。 :( – RandomEngy 2011-12-15 19:30:33

1

爲了避免您可以使用以下

XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.OmitXmlDeclaration = true; 


     using (XmlWriter xw = XmlWriter.Create(fileName, settings)) 
     { 
      doc.Save(xw); 
     } 
相關問題