【发布时间】:2015-07-16 10:46:37
【问题描述】:
我已经从另一个示例中创建了自己的 XmlTextWriter,以便我可以删除命名空间。
public class NoNamespaceXmlWriter : XmlTextWriter
{
//Provide as many contructors as you need
public NoNamespaceXmlWriter(System.IO.TextWriter output)
: base(output) { Formatting = System.Xml.Formatting.Indented; }
public override void WriteStartDocument() {}
public override void WriteStartElement(string prefix, string localName, string ns)
{
base.WriteStartElement("", localName, "");
}
}
当我使用它时,它可以正常工作,但由于某种原因,它会跳过 <xml ... > </xml> 标记。永远不会调用 WriteStartDocument()。
我无法正确指定设置,因为它们有一个私有设置器,并且通常您使用我无法覆盖的静态方法 XmlWriter.Create。我尝试自己覆盖设置,但无济于事:
public override XmlWriterSettings Settings
{
get { return new XmlWriterSettings() {OmitXmlDeclaration = false}; }
}
我要序列化的代码是:
using (StringWriter textWriter = new StringWriter())
{
using (NoNamespaceXmlWriter xmlWriter = new NoNamespaceXmlWriter(textWriter))
{
xs.Serialize(xmlWriter, p);
}
xml = textWriter.ToString();
}
知道如何让 xml 标记出现,或者为什么它会消失吗?
【问题讨论】:
-
p是什么(你能包括类定义吗?)与这个相比,使用“普通”XML 编写器的输出是什么? -
p 只是一个具有可序列化字段的类。普通的 XML 编写器输出
<?xml version="1.0" encoding="utf-16"?> -
我很确定这是设置为空或默认设置,它只是将其视为 omit=true 因为我添加了对 WriteStartDocument() 的手动调用并删除了覆盖并且它有将
<xml>声明放入 -
好吧,你说它错过了
<xml>...</xml>标签(暗示部分内容)而不是XML声明,我有点困惑。立即清除!我猜你不能从p中删除命名空间值是有原因的? -
我可以复制您的问题,但可以通过确保
WriteStartDocument调用基本实现(它被调用)来解决。请参阅此dotnetfiddle。但是你说它从来没有被调用过?
标签: c# xml xml-serialization