【问题标题】:Deserialize XML file with flexible number of attributes使用灵活数量的属性反序列化 XML 文件
【发布时间】:2013-12-11 14:08:18
【问题描述】:

我有一个 xml 文件,其中一些节点可以具有灵活数量的属性,所有属性都以相同的前缀开头:

<node a1="" a2="" ... an=""></node>
  1. 如何在 XML 架构中反映这一点?
  2. 在 C# 中将此类 xml 文件反序列化为对象的最佳方法是什么?

【问题讨论】:

    标签: c# xml xml-serialization xsd


    【解决方案1】:

    关于您的第二个问题 - 您可能希望将这些节点存储在例如字符串数组或在Dictionary&lt;string,string&gt; 中将属性名称映射到值,使用XmlSerializer 进行序列化,并在您的类中实现IXmlSerializable 接口以手动读取和写入XML。

    【讨论】:

      【解决方案2】:

      Afaik,您不能直接在 XML Schema 中反映这一点;每个属性都必须按名称声明。您可以在 Schematron 中表达它,但不能在 DTD 或 XSD 中表达;不确定RelaxNG。

      如果想法是声明“任何名称为 'a' 后跟数字的属性”,这很像尝试在编程语言中声明一组类似的变量,或在数据库中声明字段。很少有办法为这样的(可能是无限的)集合进行“元”声明。

      如果你可以施加一个最大值,比如 99 个这样的属性,你可以单独声明所有这些属性——但这很丑陋,并且不能保证一个元素会按顺序使用它们。

      如果这些属性的值只是标记(数字、名称或类似),“XML-ish”的方式是声明一个 IDREFS 或 NMTOKENS 类型的属性,它允许在价值。

      一旦您获得了值,正如 Soontz 所说,数组或可能的字典/哈希将是保存它们的明智之选。

      【讨论】:

        猜你喜欢
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 2012-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多