【问题标题】:Deserializing relative path XML反序列化相对路径 XML
【发布时间】:2019-07-20 00:34:45
【问题描述】:

在 C# 中,我想反序列化一些相对位置很重要的 Xml。以下 Xml 来自名为 Onix 的书籍标准:

<Stock>
  <OnHand>1</OnHand>
  <Proximity>xx</Proximity>
  <Reserved>2</Reserved>
  <Proximity>yy</Proximity>
  <OnOrder>3</OnOrder>
  <Proximity>zz</Proximity>
  <Cbo>4</Cbo>
  <Proximity>zz</Proximity>
</Stock>

如您所见,每 2 行都称为“Proximity”。这些字段与上面的字段一起使用。

如果所有字段都是必填项,那就没问题了,代码如下所示:

[XmlElement("OnHand", Order = 0)]public int OnHand { get; set; }
[XmlElement("Proximity", Order = 1)] public string OnHandProximity { get; set; }

[XmlElement("Reserved", Order = 2)] public int Reserved { get; set; }
[XmlElement("Proximity", Order = 3)] public string ReservedProximity { get; set; }

[XmlElement("OnOrder", Order = 4)] public int OnOrder { get; set; }
[XmlElement("Proximity", Order = 5)] public string OnOrderProximity { get; set; }

[XmlElement("CBO", Order = 6)] public int Cbo { get; set; }
[XmlElement("Proximity", Order = 7)] public string CboProximity { get; set; }

但是 4 个邻近字段与之前的字段是紧密绑定的,并且每一对字段都不是强制性的。例如。您可以在缺少前两行的地方获取 xml。

是否有针对此类问题的任何属性?

【问题讨论】:

  • xml 是垃圾。很抱歉,但你会遇到无穷无尽的麻烦。 prorbaly 应该使用 xml 属性或更好的结构。老实说..只是不要使用xml
  • @ppumkin xml 是每个处理书籍的人都认为的黄金标准。是editeur.org制作的,99%的格式都很好,但是这小部分很垃圾。
  • 那么 XML 的那部分没有遵循“黄金”标准。因为我正在查看它并且与节点没有相关性。 XML 可能以随机顺序出现……只是无法将任何重复节点与任何其他节点关联起来。因此我说 - 可能看起来更像 &lt;OnHand Proximity="XX"&gt;1&lt;/OnHand&gt;,因为它似乎是 OnHand 节点的属性 - 这更有意义,更容易验证和解析。 promixty 也可能是其他节点的属性。这完全取决于数据结构。目前这看起来像一个魔法数组
  • 一个小笔记。遗憾的是,我无法更改这个可怕的 xml,因为它是不同公司之间使用的交换格式。我已经添加了 onix 标签。
  • 我就知道你会这么说。我去过那里。看起来你必须制作一些神奇的代码才能让它工作。使用 C#,我将使用该 NODE XML,将其放入确保节点顺序正确的处理器中 - 如果它们丢失,则应用一些规则等。使用属性返回真实 XML 并使您的域模型兼容。但你可能不得不做相反的事情。因此,您的域模型将是正确的,但边缘会消耗并散发出垃圾,就好像什么都没发生一样。祝你好运

标签: c# xml serialization onix


【解决方案1】:

您正在使用 Order 属性。
ints 标记为int? 并将所有字段标记为Nullable:

    [XmlElement("OnHand", Order = 0, IsNullable = true)]
    public int? OnHand { get; set; }

    [XmlElement("Proximity", Order = 1, IsNullable = true)]
    public string OnHandProximity { get; set; }

XmlSerializer 应该能够处理这个问题。

【讨论】:

  • 需要一点时间来测试,所以我会在测试后将其标记为答案。哇!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多