【问题标题】:What class structure will mimic an XML document with alternating tags什么类结构将模仿带有交替标记的 XML 文档
【发布时间】:2019-10-01 18:19:24
【问题描述】:

我正在尝试使用 c# 以编程方式重现 XML 文件结构。文件结构给我带来了困难,因为它使用标签作为空数据集或节点下子元素的父标签。举个例子:

<?xml version="1.0" encoding="UTF-8"?>
<A>
  <B>
    <C>
      <E></E>
      <E></E>
      <F>false</F>
      <F>true</F>
      <F>false</F>
      <G>
        <H/>
      </G>
    </C>
    <B>
      <D>
        <E>continue</E>
        <G>
          <F>false</F>
          <E>1</E>
        </G>
      </D>
      <B/>
      <D>
        <E></E>
      </D>
      <B/>
    </B>
  </B>
</A>

给我带来困难的特定节点是&lt;B&gt; 节点。我不确定如何构造该类,以便它可以包含节点元素列表,除了自身之外,这些节点元素可能有也可能没有值,并将其序列化为 XML 文档。欢迎任何帮助,解释起来可能很复杂,所以我很乐意详细说明。

【问题讨论】:

标签: c# xml serialization


【解决方案1】:

如果我们要为您的 &lt;B&gt; 节点创建架构,它将由 sequencechoice 节点组成,其中 &lt;C&gt;&lt;D&gt;&lt;B&gt; 类型的元素本身可能被选中。

如果我们要在 c# 中对此进行建模,那么自然的做法是使用多态对象列表,其中的项目对应于三种元素类型。幸运的是,正如Marc Gravellthis answerUsing XmlSerializer to serialize derived classes 中所解释的那样,XmlSerializer 通过使用[XmlElement(String, Type)] 属性注释多态集合来支持这种情况,每个具体类型可能出现在集合中。

因此,您可以按如下方式定义数据模型:

public class BaseNode 
{
}

public class B : BaseNode
{
    [XmlElement("B", typeof(B))]
    [XmlElement("C", typeof(C))]
    [XmlElement("D", typeof(D))]
    public List<BaseNode> Nodes { get; } = new List<BaseNode>();
}

public class C : BaseNode
{
    [XmlElement(ElementName="E")]
    public List<string> E { get; set; }
    [XmlElement(ElementName="F")]
    public List<bool> F { get; set; }
    [XmlElement(ElementName="G")]
    public G1 G { get; set; }
}

public class D : BaseNode
{
    [XmlElement(ElementName="E")]
    public string E { get; set; }
    [XmlElement(ElementName="G")]
    public G2 G { get; set; }
}

public class G1
{
    public string H { get; set; }
}

public class G2 
{
    public string F { get; set; }
    public string E { get; set; }
}

[XmlRoot("A")]
public class A
{
    public B B { get; set; }
}

注意事项:

  • 我使B.Nodes集合中可以出现的3种类型继承自一个共同的祖先BaseNode,这样就不可能在运行时将不相关的项添加到集合中。如果您不希望这样,您可以删除 BaseNode 并将您的收藏声明为 List&lt;object&gt;

  • 根据我的经验,Generate C# class from XML 中提到的各种工具并不总是从具有复杂 &lt;xsd:choice&gt; + &lt;xsd:sequence&gt; 场景的 XML 生成最佳 c# 类。

    但是,如果您有合适的 XSD,来自 How to generate .NET 4.0 classes from xsd? 的工具将生成正确的 c# 类。

  • 在您的示例中,您有两个名为 &lt;G&gt; 的节点,它们似乎具有不同的架构,因此我必须创建两种类型 G1G2

演示小提琴here.

【讨论】:

  • 谢谢!是的,这似乎提供了我正在寻找的结构,我还有更多要添加的元素(未在我的原始问题中显示)但我相信我走在正确的轨道上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
相关资源
最近更新 更多