2010年4月27日 星期二

Linq to Xml: 寫出 XDeclaration 的資料

當以 linq to xml 的方式組 xml 是非常輕易的事情。但在下面的程式碼,想要輸出 xml declaration 卻碰到了軟釘子

錯誤寫法

   1: static void Main(string[] args)
   2: {
   3:   string xml = "<r><a>3</a></r>";
   4:   XDocument doc = new XDocument(
   5:     new XDeclaration("1.0", "big5", null),
   6:     XElement.Parse(xml));
   7:   Console.WriteLine(doc.ToString());
   8: }

輸出如下所述,並沒有包含預期的<?xml version="1.0" encoding="big5"?>

   1: <r>
   2:   <a>3</a>
   3: </r>

輸出到文字檔

為什麼呢?但如果改成下面的程式輸出到文字檔,在檔案內容就是正確的。

   1: static void Main(string[] args)
   2: {
   3:   string xml = "<r><a>3</a></r>";
   4:   XDocument doc = new XDocument(
   5:     new XDeclaration("1.0", "big5", null),
   6:     XElement.Parse(xml));
   7:   doc.Save(@"c:\temp\a.xml");
   8: }

StringWriter

我們也可以改用 StringWriter 寫出。如下例

   1: static void Main(string[] args)
   2: {
   3:   string xml = "<r><a>3</a></r>";
   4:   XDocument doc = new XDocument(
   5:     new XDeclaration("1.0", "big5", null),
   6:     XElement.Parse(xml));
   7:   var writer = new StringWriter();
   8:   doc.Save(writer);
   9:   Console.WriteLine(writer.ToString());
  10: }

輸出如下

   1: <?xml version="1.0" encoding="utf-16"?>
   2: <r>
   3:   <a>3</a>
   4: </r>

使用 StringWriter 的特性更怪,它會視XDocument 的內容來覆寫實際的 encoding。由於c# 的 string 都是 unicode,故一律輸出成 utf-16 的編碼。

最後,找到一個較能符合需求的方式。如下

兩段式ToString

   1: static void Main(string[] args)
   2: {
   3:   string xml = "<r><a>3</a></r>";
   4:   XDocument doc = new XDocument(
   5:     new XDeclaration("1.0", "big5", null),
   6:     XElement.Parse(xml));
   7:   Console.WriteLine(doc.Declaration.ToString() +  doc.ToString());
   8: }

使用兩段式的 ToString()方式是蠻奇怪的。但這是我試到最簡單的方法了

1 則留言:

ssdavidlin 提到...

Thank you very much.
很簡單的解法

Share with Facebook