【问题标题】:Cannot output <xml> tag when overriding the XmlTextWriter覆盖 XmlTextWriter 时无法输出 <xml> 标记
【发布时间】: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, "");
    }
}

当我使用它时,它可以正常工作,但由于某种原因,它会跳过 &lt;xml ... &gt; &lt;/xml&gt; 标记。永远不会调用 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 编写器输出 &lt;?xml version="1.0" encoding="utf-16"?&gt;
  • 我很确定这是设置为空或默认设置,它只是将其视为 omit=true 因为我添加了对 WriteStartDocument() 的手动调用并删除了覆盖并且它有将&lt;xml&gt; 声明放入
  • 好吧,你说它错过了&lt;xml&gt;...&lt;/xml&gt;标签(暗示部分内容)而不是XML声明,我有点困惑。立即清除!我猜你不能从p 中删除命名空间值是有原因的?
  • 我可以复制您的问题,但可以通过确保 WriteStartDocument 调用基本实现(它调用)来解决。请参阅此dotnetfiddle。但是你说它从来没有被调用过?

标签: c# xml xml-serialization


【解决方案1】:

如果这里的目标是从序列化的 XML 中删除命名空间,我建议使用更简单的方法:您可以在下面的示例应用程序中指定具有空命名空间的 XmlSerializerNamespaces 作为说明

class Program
{
    static void Main(string[] args)
    {
        Player player = new Player() { Id = 102, FirstName = "Danny", LastName = "TopScorer", AverageGoalsPerGame = 3.5, TotalGoalsScored = 150 };

        XmlSerializer serializer = new XmlSerializer(typeof(Player));
        XmlWriterSettings settings = new XmlWriterSettings() { OmitXmlDeclaration = true, Indent = true, Encoding = Encoding.UTF8 };
        StringBuilder output = new StringBuilder();
        XmlWriter writer = XmlWriter.Create(output, settings);

        XmlSerializerNamespaces xns = new XmlSerializerNamespaces();
        xns.Add(string.Empty, string.Empty);
        serializer.Serialize(writer, player, xns);

        Console.WriteLine(output.ToString());
        Console.ReadLine();
    }
}

public class Player
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int TotalGoalsScored { get; set; }
    public double AverageGoalsPerGame { get; set; }
}

它会输出:

<Player>
  <Id>102</Id>
  <FirstName>Danny</FirstName>
  <LastName>TopScorer</LastName>
  <TotalGoalsScored>150</TotalGoalsScored>
  <AverageGoalsPerGame>3.5</AverageGoalsPerGame>
</Player>

否则,默认情况下 Player 元素将如下所示:

<Player xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://
www.w3.org/2001/XMLSchema">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多