将XML反序列化为C#类成员而不嵌套标记

将XML反序列化为C#类成员而不嵌套标记,c#,xml,xml-deserialization,C#,Xml,Xml Deserialization,我有一些xml看起来像这样: <data> <typeadatas> <typea> <name>ExampleName1</name> <!-- Other tags --> </typea> <!-- And more type a data --> </typeadatas>

我有一些xml看起来像这样:

<data>
    <typeadatas>
        <typea>
            <name>ExampleName1</name>
            <!-- Other tags -->
        </typea>
        <!-- And more type a data -->
    </typeadatas>
    <arrays>
        <typea>
            <name>ExampleName2</name>
            <!-- Other tags, same as tags in other <typea> tag above -->
            <dimension1>
                <!-- tags informing about the dimension -->
            </dimension1>
         </typea>
     </arrays>
</data>

示例名称1
例2
它描述了另一个程序中的一系列变量,以便调试器等工具能够理解内存布局

我需要将其放入一系列C#类中,以便能够进行进一步的处理。目前,我有一系列的类,看起来像:

class Data : IXmlSerializable {
    /* Custom implementation of ReadXml to handle various complications in the xml not shown here */
    List<TypeA> TypeAData
    List<ArrayType<TypeA>> TypeADataInArrays
}

class BaseType {
    public string Name;
    /* Other properties */
}

class TypeA : BaseType {
}

class Dimension {
    /* Dimension properties */
}

class ArrayType<T> where T : BaseType {
    T BaseData;
    Dimension Dimension1;
}
类数据:IXmlSerializable{
/*ReadXml的自定义实现,以处理此处未显示的xml中的各种复杂情况*/
列表类型数据
列表类型数组
}
类基类{
公共字符串名称;
/*其他属性*/
}
类别A:基本类型{
}
类维度{
/*维度属性*/
}
类ArrayType,其中T:BaseType{
T基础数据;
尺寸1;
}
还存在存储的其他数据类型,但(目前)与typea共享相同的数据集。因此,BaseType用于存储所有公共元素。但我不想相信这是真的

对于数组信息,它们存储关于一个单独数据段的数据(因此在给出的示例中typea标记是独立的),但我仍然希望在数组的公共类中重用公共数据,以处理维度等。但是,在给定的类中,BaseData成员从不从XML反序列化过程接收数据,因为C#希望它位于另一个标记中。但是,我不想在那里有另一个标记,因为它只会使XML更难理解

因此,除了为ArrayType创建一个自定义ReadXml函数外,还有没有一种方法可以让C#在不使用BaseData标记的情况下,自动将typea数组元素中的标记读取到BaseData中

为了澄清这一点,我希望能够使用指向arrays标记中typea标记的XmlReader运行以下操作:

ArrayType<TypeA> theData;
XmlSerializer xmlS = new XmlSerializer(typeof(ArrayType<TypeA>));
theData = (ArrayType<TypeA>)xmlS.Deserialize(reader);
数组键入数据;
XmlSerializer xmlS=新的XmlSerializer(typeof(ArrayType));
数据=(ArrayType)xmlS.反序列化(读取器);
并使该标签中的所有可用数据可用。Dimension1字段现在已经填写完毕,但BaseData字段保留为空,因为C#希望xml中有一个BaseData标记,而xml中不存在BaseData标记。最好在不更改Xml的情况下,我需要获得可用的数据。

为什么
ArrayType
甚至要使用泛型?它不应该只是
BaseType
TypeA
的子类吗?这样,您的
ArrayType
将得到它自己的
Dimension
填充,以及它的基类中的
Name
和其他内容

现在,上面的对象模型非常混乱(可能也是因为它实际表示的内容被模糊了)

在处理奇怪的XML结构时,我通常只需从XML中提取XSD,并尝试查看自动生成的C#类的外观。 即使不适合以后使用,也可以使用它将信息读入其中,然后从自动生成的对象中的数据填充实际需要的任何对象模型

如果您不熟悉XSD.exe,还有一些在线工具,例如:

其中一个生成了以下XSD模式:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="typeadatas">
          <xs:annotation>
            <xs:documentation>And more type a data</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element name="typea">
                <xs:annotation>
                  <xs:documentation>Other tags</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:string" name="name"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="arrays">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="typea">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:string" name="name"/>
                    <xs:element type="xs:string" name="dimension1">
                      <xs:annotation>
                        <xs:documentation>Other tags, same as tags in other &lt;typea> tag above  tags informing about the dimension</xs:documentation>
                      </xs:annotation>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

以及更多a类数据
其他标签
其他标记,与其他类型中的标记相同A>标记上面的标记通知尺寸
把这个模式放到这个网站上:你可以得到一个更标准的C#类定义,这样你就可以阅读它了

通过这种方式,您可以使用自动生成的代码作为方便阅读的一种方式,但以后可以从中迭代、计算和填充您自己的复杂模型


我认为,尝试将奇怪的xml与复杂的对象模型直接混合会导致相当多的麻烦(更不用说它们的耦合程度有多高)。

您能澄清一下您想要的是什么吗?我认为你的最后一段缺少一些信息。哎呀,没有仔细校对。基本上,我希望能够将arrays元素中的typea元素反序列化为ArrayType,而无需编写自定义ReadXml函数。但我不确定C#是否允许这样做。更新的问题试图解释这一点。最后的第三行C#行“T BaseData”,应该是“T[]BaseData;”?我发现很难理解你在做什么。如果您提供了一个真正的XML示例,而没有诸如“a类型的某些数据”和“”以及“使用a类型的数据数组”等模糊的占位符,则可能会有所帮助。关于代码,它不是数组,但缺少分号。我已经用一些关于Xml格式的信息更新了这个问题,以及如何读取Xml数据。该格式描述了一系列变量(其中一些可能是数组)。因此,基本数据描述的数组id和有关维度的信息。不幸的是,由于公司政策的原因,我不能提供一个真实的例子。关于你的问题,它使用泛型,因此如果TypeA将来有更多的属性,ArrayType只有在引用TypeA时才能访问它们。允许使用其他类型(称为TypeB/TypeC),其中一些类型确实有额外的属性,但所有类型都需要用作ArrayType。我