C# 当元素/属性已知时,如何将XML映射到类/数据集,但不要';不是每次都会发生吗?
对于一个C#项目,我正在查询一个API,它会返回一个类似以下内容的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
<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)以获取所需数据。