使用序列化将复杂的xml文件转换为c#对象

本文关键字:转换 文件 对象 xml 序列化 复杂 | 更新日期: 2023-09-27 18:04:15

假设我有这样一个XML文件:

 <functionList>
<function name="a" id="11" >
  <InputParameters>
   <Value>
    <Range>
      <DiscreteRange>
        <DiscreteValue value="0" description="Stream 1" />
        <DiscreteValue value="1" description="Stream 2" />
      </DiscreteRange>
    </Range>
   </Value>
  </InputParameters>
  <ReturnValues>
    <Status type="BYTE"  description="0 successful, error otherwise">
      <Range>
        <SequenceRange min="0x00" max="0xFF"/>
      </Range>
    </Status>
    <Value type="UWORD32"  description="Stream select setting">
      <Range>
        <DiscreteRange>
          <DiscreteValue value="0" description="Stream 1" />
          <DiscreteValue value="1" description="Stream 2" />
        </DiscreteRange>
      </Range>
    </Value>
  </ReturnValues>
</functions>
<function name="b" id="12" >
  <InputParameters>
   <Value>
    <Range>
      <SequenceRange min="0x00" max="0xFF"/>
    </Range>
   </Value>
  </InputParameters>
  <ReturnValues>
    <Status type="BYTE"  description="0 successful, error otherwise">
      <Range>
        <SequenceRange min="0x00" max="0xFF"/>
      </Range>
    </Status>
    <Value type="UWORD32"  description="Stream select setting">
      <Range>
        <DiscreteRange>
          <DiscreteValue value="0" description="Stream 1" />
          <DiscreteValue value="1" description="Stream 2" />
        </DiscreteRange>
      </Range>
    </Value>
  </ReturnValues>
</functions>
<function name="c"  id="13"  >
  <InputParameters></InputParameters>
  <ReturnValues>
    <Status type="BYTE"  description="0 successful, error otherwise">
      <Range>
        <SequenceRange min="0x00" max="0xFF"/>
      </Range>
    </Status>
  </ReturnValues>
</function>

一般来说,我的XML结构是这样的:
 <functionList  >
<function  name=""  id="">
  <InputParameters>
    <!--Optional -->
    <Value type="" description="">
      <Range>
        <!--OR-->
        <DiscreteRange>
          <DiscreteValue value="" description="" />
          <DiscreteValue value="" description="" />
          <!--...-->
        </DiscreteRange>
        <!--OR-->
        <SequenceRange min="" max=""/>
        <!--OR-->
        <StringRange characters=""/>
        <!--OR-->
        <CharRange/>
      </Range>
    </Value>
    <!-- <Value type="" description="">...-->
         <!-- </Value>-->
    <!-- <Value type="" description="">...-->
    <!-- </Value>-->
    <!-- <Value type="" description="">...-->
    <!-- </Value>-->
         <!--...-->
  </InputParameters>
  <ReturnValues>
    <Status type=""  description="">
      <Range>
        <!--OR-->
        <DiscreteRange>
          <DiscreteValue value="" description="" />
          <DiscreteValue value="" description="" />
          <!--...-->
        </DiscreteRange>
        <!--OR-->
        <SequenceRange min="" max=""/>
        <!--OR-->
        <StringRange characters=""/>
        <!--OR-->
        <CharRange/>
      </Range>
    </Status >
    <!--Optional -->
    <Value type="" description="">
      <Range>
        <!--OR-->
        <DiscreteRange>
          <DiscreteValue value="" description="" />
          <DiscreteValue value="" description="" />
          <!--...-->
        </DiscreteRange>
        <!--OR-->
        <SequenceRange min="" max=""/>
        <!--OR-->
        <StringRange characters=""/>
        <!--OR-->
        <CharRange/>
      </Range>
    </Value>
    <!-- <Value type="" description="">...-->
    <!-- </Value>-->
    <!-- <Value type="" description="">...-->
    <!-- </Value>-->
    <!-- <Value type="" description="">...-->
    <!-- </Value>-->
    <!--...-->
  </ReturnValues>
</function>
<!--function...-->

据我所知,使用c#内置的反序列化不起作用,因为没有固定的结构到文件。

有没有人知道我如何创建一个层次c#对象(反序列化)基于这个结构?

如果可能的话,我很乐意看到一个例子,或者一个教程如何构建这样的东西。

使用序列化将复杂的xml文件转换为c#对象

由于您没有方案定义文件,您可以自己编写。XmlDocument在这里很好用。

这不是一个有效的例子。但你会明白的。

public class Document
{
    public static Document Create(Stream input)
    {
        var doc = new XmlDocument();
        doc.Load(input);
        return new Document(doc);
    }
    public class Function
    {
        public string Name { get; set; }
        public string Id { get; set; }
        public Function(XmlNode node)
        {
            Name = node.Attributes["name"].ToString();
            Id = node.Attributes["id"].ToString();
        }
        // Return values
        // Parameters
    }
    public List<Function> Functions { get; set; }
    public Document(XmlDocument doc)
    {
        Functions = new List<Function>();
        var list = doc.GetElementsByTagName("functionlist");
        XmlNode root = list[0];
        XmlNodeList children = root.ChildNodes;
        foreach (var child in children)
        {
            Functions.Add(new Function(child));
        }
    }
}

它基本上是在XmlNodeLists中遍历XmlNode,获取这些节点的Attributes和InnerValues。