Đầu ra XML khá tùy chỉnh với khai báo XML UTF-8
Định nghĩa lớp sau đây đưa ra một phương thức đơn giản để chuyển đổi một chuỗi XML đầu vào thành XML đầu ra được định dạng với khai báo xml là UTF-8. Nó hỗ trợ tất cả các tùy chọn cấu hình mà lớp XmlWriterSinstall cung cấp.
using System;
using System.Text;
using System.Xml;
using System.IO;
namespace CJBS.Demo
{
/// <summary>
/// Supports formatting for XML in a format that is easily human-readable.
/// </summary>
public static class PrettyXmlFormatter
{
/// <summary>
/// Generates formatted UTF-8 XML for the content in the <paramref name="doc"/>
/// </summary>
/// <param name="doc">XmlDocument for which content will be returned as a formatted string</param>
/// <returns>Formatted (indented) XML string</returns>
public static string GetPrettyXml(XmlDocument doc)
{
// Configure how XML is to be formatted
XmlWriterSettings settings = new XmlWriterSettings
{
Indent = true
, IndentChars = " "
, NewLineChars = System.Environment.NewLine
, NewLineHandling = NewLineHandling.Replace
//,NewLineOnAttributes = true
//,OmitXmlDeclaration = false
};
// Use wrapper class that supports UTF-8 encoding
StringWriterWithEncoding sw = new StringWriterWithEncoding(Encoding.UTF8);
// Output formatted XML to StringWriter
using (XmlWriter writer = XmlWriter.Create(sw, settings))
{
doc.Save(writer);
}
// Get formatted text from writer
return sw.ToString();
}
/// <summary>
/// Wrapper class around <see cref="StringWriter"/> that supports encoding.
/// Attribution: http://stackoverflow.com/a/427737/3063884
/// </summary>
private sealed class StringWriterWithEncoding : StringWriter
{
private readonly Encoding encoding;
/// <summary>
/// Creates a new <see cref="PrettyXmlFormatter"/> with the specified encoding
/// </summary>
/// <param name="encoding"></param>
public StringWriterWithEncoding(Encoding encoding)
{
this.encoding = encoding;
}
/// <summary>
/// Encoding to use when dealing with text
/// </summary>
public override Encoding Encoding
{
get { return encoding; }
}
}
}
}
Khả năng cải thiện hơn nữa: -
- Một phương thức bổ sung
GetPrettyXml(XmlDocument doc, XmlWriterSettings settings)
có thể được tạo ra cho phép người gọi tùy chỉnh đầu ra.
- Một phương pháp bổ sung
GetPrettyXml(String rawXml)
có thể được thêm vào để hỗ trợ phân tích văn bản thô, thay vì khách hàng sử dụng XmlDocument. Trong trường hợp của tôi, tôi cần phải thao tác XML bằng XmlDocument, do đó tôi đã không thêm điều này.
Sử dụng:
String myFormattedXml = null;
XmlDocument doc = new XmlDocument();
try
{
doc.LoadXml(myRawXmlString);
myFormattedXml = PrettyXmlFormatter.GetPrettyXml(doc);
}
catch(XmlException ex)
{
// Failed to parse XML -- use original XML as formatted XML
myFormattedXml = myRawXmlString;
}