【发布时间】:2011-07-26 16:42:24
【问题描述】:
我正在使用XmlWriter.Create() 获取写入器实例然后写入XML,但结果有<?xml version="1.0" encoding="utf-16" ?>,我如何告诉我的xml 写入器不生成它?
【问题讨论】:
我正在使用XmlWriter.Create() 获取写入器实例然后写入XML,但结果有<?xml version="1.0" encoding="utf-16" ?>,我如何告诉我的xml 写入器不生成它?
【问题讨论】:
使用XmlWriterSettings.OmitXmlDeclaration。
不要忘记将XmlWriterSettings.ConformanceLevel 设置为ConformanceLevel.Fragment。
【讨论】:
The XML declaration is always written if ConformanceLevel is set to Document, even if OmitXmlDeclaration is set to true
ConformanceLevel.Document 是默认设置,但您可以设置ConformanceLevel.Fragment...
您可以继承 XmlTextWriter 并覆盖 WriteStartDocument() 方法以不做任何事情:
public class XmlFragmentWriter : XmlTextWriter
{
// Add whichever constructor(s) you need, e.g.:
public XmlFragmentWriter(Stream stream, Encoding encoding) : base(stream, encoding)
{
}
public override void WriteStartDocument()
{
// Do nothing (omit the declaration)
}
}
用法:
var stream = new MemoryStream();
var writer = new XmlFragmentWriter(stream, Encoding.UTF8);
// Use the writer ...
参考:来自 Scott Hanselman 的 blog post。
【讨论】:
您可以将XmlWriter.Create() 用于:
new XmlWriterSettings {
OmitXmlDeclaration = true,
ConformanceLevel = ConformanceLevel.Fragment
}
public static string FormatXml(string xml)
{
if (string.IsNullOrEmpty(xml))
return string.Empty;
try
{
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
using (MemoryStream memoryStream = new MemoryStream())
using (XmlWriter writer = XmlWriter.Create(
memoryStream,
new XmlWriterSettings {
Encoding = Encoding.Unicode,
OmitXmlDeclaration = true,
ConformanceLevel = ConformanceLevel.Fragment,
Indent = true,
NewLineOnAttributes = false }))
{
document.WriteContentTo(writer);
writer.Flush();
memoryStream.Flush();
memoryStream.Position = 0;
using (StreamReader streamReader = new StreamReader(memoryStream))
{
return streamReader.ReadToEnd();
}
}
}
catch (XmlException ex)
{
return "Unformatted Xml version." + Environment.NewLine + ex.Message;
}
catch (Exception ex)
{
return "Unformatted Xml version." + Environment.NewLine + ex.Message;
}
}
【讨论】: