當以 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 則留言:
Thank you very much.
很簡單的解法
張貼留言