如何解析具有重复的子节点和非重复的子节点的节点?

时间:2019-02-18 23:38:33

标签: c# .net-core xmlserializer

让我们开始处理任何可能与How to read xml document in MVC core (1.0.0)?相同的概念,该概念仅考虑此结构,可以用things: thing[]来表示。

<things>
  <thing>..</thing>
  <thing>..</thing>
  <thing>..</thing>
  …
</things>

这个问题是关于如何将以下内容表达为类。

<things>
  <a>..</a>
  <b>..</b>
  <c>..</c>
  <d>..</d>
  <d>..</d>
  <d>..</d>
  …
</things>

这绝对是不是数组。它可以说是一本字典,但是我们明确禁止将IDictionary<T1,T2>XmlSerializer一起使用。

通常,我将从类开始,让XmlSerializer告诉我XML格式,但是这种XML是由系统控制的。

更麻烦的是,字符串是一个密封的类,因此您不能从其继承,因此无法为字段命名而对其进行别名。

如何对具有重复的重复子节点和不重复的子节点的节点反序列化?

2 个答案:

答案 0 :(得分:1)

对我来说,它看起来像是一组可能继承相同基类的不同类型的对象。我会做这样的事情:

[XmlInclude(typeof(A))]
[XmlInclude(typeof(B))]
...
public class BaseClass {}

[XmlRoot("a")]
public class A : BaseClass { }

[XmlRoot("b")]
public class B : BaseClass { }
...

public class Things
{
   [XmlElement("things")]
   public BaseClass[] Items { get; set; }
}

答案 1 :(得分:0)

一旦找到它,答案就非常简单:将XmlElement属性应用于数组成员。在https://docs.microsoft.com/en-us/dotnet/standard/serialization/controlling-xml-serialization-using-attributes#serializing-an-array-as-a-sequence-of-elements

上的更多详细信息
public class thing {
  public string a { get; set; }
  public string b { get; set; }
  public string c { get; set; }
  [XmlElement]
  public string[] d { get; set; }
}

然后,我们可以将d的零次或多次出现作为没有集合节点拥有和键入它们的直接子级来解析为thing对象的array属性。

为阐明属性的作用,属性thing.d的值是一个集合,其中的元素是匿名的并且具有字符串类型。序列化正好反映了这一点,为您提供了一个带有子节点的集合节点“ d”,这些子节点的名称来自其类型:

<things>
  <a>..</a>
  <b>..</b>
  <c>..</c>
  <d>
    <string>..</string>
    <string>..</string>
    …
  </d>
</things>

但是,这不是我们要解析的内容。 [XmlElement]属性可防止将该属性视为一个集合,如果它不是一个集合,则它可以映射到XML的唯一 other 方式是作为重复元素。