XDocumentは、1行目の宣言(バージョン、エンコード)を含むすべてのノードを取得する

3422 ワード

XDocumentをxmlファイルとして保存する方法は以下の通りです.
XDocument doc = new XDocument(

    new XDeclaration("1.0","UTF-8",null),

    new XElement("Persons",                         

        new XElement("Person",

            new XAttribute("id","1"),

            new XElement("Name"," "),

            new XElement("Age",18)

        )                  

    )

    );

doc.Save("person.xml");

person.xmlが開くと、最初の行のバージョンと符号化宣言があります.

張三18ToString(); このときxmlの値は以下のようになり、xmlの最初の行の宣言を取得できません:張三18解決方法はいくつかあります.1つ目は、比較的簡単です.
string xml = doc.Declaration.ToString() + doc.ToString();

2つ目は、拡張方法を書くことです
 
 public static string ToStringWithDeclaration(this XDocument doc, SaveOptions options = SaveOptions.DisableFormatting)

        {

            return doc.Declaration.ToString() + doc.ToString(options);

        }

呼び出し:
string xml = doc.ToStringWithDeclaration();

 
3つ目は、同じように拡張方法を書いてカプセル化します
public static string ToStringWithDeclaration(this XDocument doc)

       {

           StringBuilder sb = new StringBuilder();

           using (TextWriter tw = new StringWriter(sb))

           {               

               doc.Save(tw, SaveOptions.DisableFormatting);

           }         

           return sb.ToString();

       }


この方法では、生成された符号化宣言がencoding="utf-16"となり、encoding="utf-8"に変換するには、クラスUtf 8 StringWriterがStringWriterを継承し、リロード属性EncodingをUTF 8に設定することができ、完全なコードは以下の通りである.
 public class Utf8StringWriter : StringWriter

        {

            public Utf8StringWriter(StringBuilder sb) : base(sb){ }

            public override Encoding Encoding { get { return Encoding.UTF8; } }

        }

       public static string ToStringWithDeclaration(this XDocument xdoc)

       {

           StringBuilder sb = new StringBuilder();

           using (TextWriter tw = new Utf8StringWriter(sb))

           {   

               xdoc.Save(tw, SaveOptions.DisableFormatting);

           }

           return sb.ToString();

       }

コメント:
XDocument.ToStringメソッドには2つのリロードリストがあり、XMLノードをインデントするかどうかを設定できます.
名前説明ToString()は、このノードのインデントXMLを返します.ToString(SaveOptions)は、このノードのXMLを返し、フォーマットの無効化を選択することもできます.SaveOptionsには2つの列挙値があります.DisableFormattingはNoneインデントをインデントしません.
XDocument.セーブメソッドにもパラメータSaveOptionsが設定できます.
参考記事:http://msdn.microsoft.com/zh-cn/library/vstudio/bb538297%28v=vs.90%29.aspx http://stackoverflow.com/questions/1228976/xdocument-tostring-drops-xml-encoding-tag http://stackoverflow.com/questions/5248400/why-does-the-xdocument-give-me-a-utf16-declaration