【问题标题】:XML Serialization different elementName for same objectXML序列化同一对象的不同elementName
【发布时间】:2020-02-27 10:20:58
【问题描述】:

我在 ASP.Net Core 中有以下模型

[Serializable]
    [XmlRoot(ElementName = "CREDIT")]
    public class Credit
    {
  [XmlElement(ElementName = "D_numbern")]
        public string Number get; set; }
}

我用StringWriter进行了序列化,问题是我应该得到这样的XML

<CREDITS>
    <CREDIT ID="1">
     <D_number1>06</D_number1>
      </CREDIT>

      <CREDIT ID="2">
     <D_number2>06</D_number2>
      </CREDIT>
</CREDITS>

我没有找到一个解决方案,如何使每个学分的 n 动态化。 提前感谢您的帮助。

【问题讨论】:

  • XML 不能在根级别有一个数组,除非它是“格式不正确”。序列化需要“格式良好的 XML”,因此数组不能位于根目录。因此,如果您希望 credit 是一个数组,则需要另一个调用 credit 的类。新类中有 public Credit[] credit { get;set;}
  • @jdweng 我希望(也许超出希望)这只是两个不同的不相关示例,以说明场景之间的变化
  • 我明白谢谢你:)

标签: c# xml asp.net-core xml-serialization


【解决方案1】:

你所追求的不是XmlSerializer 支持的东西,坦率地说,这对于 xml 来说通常是一个糟糕的设计;它不仅是多余的(xml 是有序的:没有必要告诉它你是第 1/2/3 项),而且它对大多数 xml 工具(包括序列化程序、模式验证器等)都是敌对的。

我的强烈建议是重新考虑您想要的 xml,或者如果它不是您的想法,则挑战要求。如果D_number42 将始终匹配作为父级的ID="42",坦率地说,后缀绝对没有任何作用。如果只是巧合地在这些示例中看起来相同的不同数字,那么:&lt;D_number someattribute="42"&gt;06&lt;/D_number&gt;

但如果您必须这样做,则必须通过XDocumentXmlDocumentXmlWriter 手动进行。


XmlWriter为例:

    static void WriteCredit(XmlWriter xml, string id, string number)
    {
        xml.WriteStartElement("CREDITS");
        xml.WriteStartElement("CREDIT");
        xml.WriteAttributeString("ID", id);
        xml.WriteElementString("D_number" + id, number);
        xml.WriteEndElement();
        xml.WriteEndElement();
    }

写入控制台的用法:

    using (var xml = XmlWriter.Create(Console.Out))
    {
        WriteCredit(xml, "1", "06");
    }

【讨论】:

  • 感谢您的回复,我使用了一个需要 XML 的外部 API,我也真的不明白为什么。你能告诉我一个例子,说明我如何用 XmlWriter 做到这一点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多