public static string XmlDocumentToString(XmlDocument xmlDoc, bool indent = true, Encoding encoding = null)
{
if (xmlDoc == null) throw new ArgumentNullException(nameof(xmlDoc));
encoding ??= Encoding.UTF8;
using (var ms = new MemoryStream())
{
var settings = new XmlWriterSettings
{
Encoding = encoding,
Indent = indent,
IndentChars = " ",
NewLineChars = Environment.NewLine,
OmitXmlDeclaration = false // true 則不輸出
};
using (var writer = XmlWriter.Create(ms, settings))
{
xmlDoc.Save(writer); // 寫入 MemoryStream
}
// 取得位元組陣列並解碼
return encoding.GetString(ms.ToArray());
}
}
string xmlString = xmlDoc.OuterXml; // 含 XML 宣告、無縮排、UTF-16 (內部)
// 若需指定編碼,仍需用 MemoryStream + XmlWriter
| 特性 | OuterXml | XmlWriter + MemoryStream |
|---|---|---|
| 縮排/美化 | 無 (單行) | 可控制 (Indent/IndentChars) |
| 編碼 | 內部 UTF-16 字串 | 可指定 UTF-8、BigEndianUnicode 等 |
| XML 宣告 | 含 | 可控制 (OmitXmlDeclaration) |
| 效能 | 極快 (直接回傳內部字串) | 稍慢 (序列化+解碼) |
| 適用場景 | 除錯、日誌、小型 XML | 檔案儲存、網路傳輸、人工閱讀 |
var doc = new XmlDocument();
doc.LoadXml("A B ");
// 1. 簡易輸出
Console.WriteLine(doc.OuterXml);
// A B
// 2. 美化輸出 (適合存檔)
string pretty = XmlDocumentToString(doc, indent: true);
Console.WriteLine(pretty);
/*
A
B
*/
// 3. 指定編碼儲存檔案
File.WriteAllText(@"C:\Output\pretty.xml", pretty, Encoding.UTF8);
var settings = new XmlWriterSettings
{
OmitXmlDeclaration = true, // 不輸出
NamespaceHandling = NamespaceHandling.OmitDuplicates // 移除重複 xmlns
};
// 結合 XmlWriter.Create 使用
原文連結:https://www.bianceng.cn/Programming/csharp/201410/45485.htm