C# 当元素/属性已知时,如何将XML映射到类/数据集,但不要';不是每次都会发生吗?

C# 当元素/属性已知时,如何将XML映射到类/数据集,但不要';不是每次都会发生吗?,c#,xml,dataset,C#,Xml,Dataset,对于一个C#项目,我正在查询一个API,它会返回一个类似以下内容的XML: <itemlist> <item attrib1="Value1" attrib2="Value2"... attrib15="Value15"> <sometypeinfo1 attrib1="Value1" attrib2="Value2"... attrib15="Value15"> <subelement> <somep

对于一个C#项目,我正在查询一个API,它会返回一个类似以下内容的XML:

<itemlist>
  <item attrib1="Value1" attrib2="Value2"... attrib15="Value15">
    <sometypeinfo1 attrib1="Value1" attrib2="Value2"... attrib15="Value15">
      <subelement>
        <someproperty attrib1="Value1" attrib2="Value2"/>
        <someproperty attrib1="Value1" attrib2="Value2"/>
        <someproperty attrib1="Value1" attrib2="Value2"/>
      </subelement>
    </sometypeinfo1>
    <sometypeinfo2>
      <subelement attrib1="Value1" attrib2="Value2">
        <someproperty>
          <somedescription attrib1="Value1" attrib2="Value2"/>
          <somedescription attrib1="Value1" attrib2="Value2"/>
        </someproperty>
      </subelement>
    </sometypeinfo2>
    <sometypeinfo3 attrib1="Value1" attrib2="Value2"/>
    <sometypeinfo4>
      <someproperty attrib1="Value1" attrib2="Value2"/>
    </sometypeinfo4>
    <sometypeinfo5>
      <someproperty attrib="somevalue"/>
    </sometypeinfo5>
    <somemodifiers>
      <somemodifier attrib1="Value1" attrib2="Value2"/>
      <somemodifier attrib1="Value1" attrib2="Value2"/>
      <somemodifier attrib1="Value1" attrib2="Value2"/>
    </somemodifiers>
    <someflags>
      <someflag attrib="somevalue"/>
      <someflag attrib="somevalue"/>
      <someflag attrib="somevalue"/>
    </someflags>
  </item>
  <item>
  .
  .
  .
  </item>
</itemlist>

.
.
.
它基本上是一个约100个项目/文件的列表,每个项目都有大量的描述、属性等。 现在,这并不是什么不寻常的事情。 我无法将其映射到类或数据集。比如这条线

<sometypeinfo1 attrib1="Value1" attrib2="Value2"... attrib15="Value15">

一个项目可能会遗漏属性1,另一个属性2,第三个项目可能会遗漏所有15个,以此类推

与“Someflags”相同,一个项目可以有5个“someflag”,下一个项目只能有2个。 等 每个元素或属性都可以存在,但不是必须存在。所以它们都共享一个元素池/attrib,这就是我陷入序列化等困境的地方

是的,我是新来的。但是从我到目前为止所了解到的情况来看,模式必须具有所有元素/属性才能正确映射XML


唯一想到的是编写另一个工具来收集所有可能的元素等,然后编写一个包含all的类,首先将所有元素都设为NULL,然后只解析XML,覆盖在实际项中找到的所有元素。

大多数XML解析工具将元素的属性表示为集合,您可以迭代该集合

它们还将子元素表示为一个集合

下面是一些使用我选择的XML解析类的示例语法,但c#有多个内置选项,您可以随意探索

        XmlDocument doc = new XmlDocument();
        doc.Load("myXML.xml");
        XmlNode node = doc.SelectSingleNode("//sometypeinfo1");

        foreach (XmlAttribute a in node.Attributes)
        {
            Console.Write(a.Name);
            Console.Write(a.Value);
        }

我们遇到了类似的问题,并使用XSLT样式表将原始XML的属性转换为新XML文档中的元素(将XSLT加载到XslTransform对象中以转换原始XML)。然后将新的XML文档读入DataSet对象

请参阅msdn文章: 及

将上述XML从属性转换为元素的部分XSLT示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" omit-xml-declaration="no"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/itemlist"/>
    </xsl:template>
    <xsl:template match="itemlist">
        <xsl:element name="itemlist">
            <xsl:apply-templates select="item"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="item">
        <xsl:element name="item">
            <xsl:element name="attrib1">
                <xsl:value-of select="@attrib1"/>
            </xsl:element>
            <xsl:element name="attrib2">
                <xsl:value-of select="@attrib2"/>
            </xsl:element>
            <xsl:element name="attrib3">
                <xsl:value-of select="@attrib3"/>
            </xsl:element>
            <!-- continue above pattern for all 15 attributes. -->
            <xsl:apply-templates select="sometypeinfo1"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="sometypeinfo1">
        <xsl:element name="sometypeinfo1">
            <xsl:element name="attrib1">
                <xsl:value-of select="@attrib1"/>
            </xsl:element>
            <xsl:element name="attrib2">
                <xsl:value-of select="@attrib2"/>
            </xsl:element>
            <xsl:element name="attrib3">
                <xsl:value-of select="@attrib3"/>
            </xsl:element>
                <!-- continue above pattern for all 15 attributes. -->
                <xsl:apply-templates select="subelement"/>
            </xsl:element>
        </xsl:element>
    </xsl:template>
    <xsl:template match="subelement">...

...

您可以声明包含所有属性和标记的类(如您所说)以反序列化为具体类,或者手动解析(例如使用Linq2xml)以获取所需数据。