C# 将XML数据集数据表合并到一个数据表中

C# 将XML数据集数据表合并到一个数据表中,c#,xml,datatable,ssis,C#,Xml,Datatable,Ssis,我需要使用C#解析XML文档,以便将数据输入数据库 目前,我正在使用SSIS和此C#代码将文档读入数据集: var xmlString = File.ReadAllText(Variables.filepath); var stringReader = new StringReader(xmlString); var dsSet = new DataSet(); dsSet.ReadXml(stringReader); 这可以完美地读取XML,但它会将XML分解为多个具有关系的表。有没有一种方

我需要使用C#解析XML文档,以便将数据输入数据库

目前,我正在使用SSIS和此C#代码将文档读入数据集:

var xmlString = File.ReadAllText(Variables.filepath);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);
这可以完美地读取XML,但它会将XML分解为多个具有关系的表。有没有一种方法可以将所有数据表合并到一个表中,这样我就可以将所有数据表合并到一个SQL表中

XML示例:

关系示例:

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Message Id", typeof(string));
            dt.Columns.Add("Protocol Version", typeof(string));
            dt.Columns.Add("Name Instance URL", typeof(string));
            dt.Columns.Add("Classname", typeof(string));
            dt.Columns.Add("Key Binding", typeof(string));
            dt.Columns.Add("Key Value", typeof(string));
            dt.Columns.Add("Property Name", typeof(string));
            dt.Columns.Add("Value", typeof(string));
            dt.Columns.Add("Display Value", typeof(string));

            XDocument doc = XDocument.Load(FILENAME);

            XElement cim = doc.Root;
            XElement message = cim.Element("MESSAGE");
            List<XElement> values = message.Descendants("VALUE.NAMEDINSTANCE").ToList();


            string messageId = (string)message.Attribute("ID");
            string version = (string)message.Attribute("PROTOCOLVERSION");

            foreach (XElement value in values)
            {
                string url = value.GetNamespaceOfPrefix("fo").NamespaceName;

                XElement instanceName = value.Element("INSTANCENAME");
                string classname = (string)instanceName.Attribute("CLASSNAME");
                string binding = (string)instanceName.Element("KEYBINDING").Attribute("NAME");
                string key = (string)instanceName.Descendants("KEYVALUE").FirstOrDefault();
                XElement instance = value.Element("INSTANCE");
                foreach (XElement valueArray in instance.Descendants("VALUE.ARRAY"))
                {
                    dt.Rows.Add(new object[] {
                        messageId,
                        version,
                        url,
                        classname,
                        binding,
                        key,
                        (string)valueArray.Attribute("NAME"),
                        (string)valueArray.Element("VALUE"),
                        (string)valueArray.Element("DisplayValue")
                    });
                }
                foreach (XElement property in instance.Elements("PROPERTY"))
                {
                    dt.Rows.Add(new object[] {
                        messageId,
                        version,
                        url,
                        classname,
                        binding,
                        key,
                        (string)property.Attribute("NAME"),
                        (string)property.Element("VALUE"),
                        (string)property.Element("DisplayValue")
                    });

                }
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
添加(“消息Id”,类型(字符串));
添加(“协议版本”,类型(字符串));
Add(“Name实例URL”,typeof(string));
Add(“Classname”,typeof(string));
添加(“键绑定”,typeof(string));
dt.Columns.Add(“键值”,typeof(字符串));
添加(“属性名称”,类型(字符串));
添加(“值”,类型(字符串));
dt.Columns.Add(“显示值”,类型(字符串));
XDocument doc=XDocument.Load(文件名);
XElement cim=doc.Root;
XElement message=cim.Element(“消息”);
列表值=message.substands(“VALUE.NAMEDINSTANCE”).ToList();
string messageId=(string)message.Attribute(“ID”);
字符串版本=(字符串)message.Attribute(“PROTOCOLVERSION”);
foreach(值中的像素值)
{
字符串url=value.GetNamespaceOfPrefix(“fo”).NamespaceName;
XElement instanceName=value.Element(“instanceName”);
string classname=(string)instanceName.Attribute(“classname”);
字符串绑定=(字符串)instanceName.Element(“KEYBINDING”).Attribute(“NAME”);
字符串键=(字符串)instanceName.substands(“KEYVALUE”).FirstOrDefault();
XElement实例=value.Element(“实例”);
foreach(instance.subjects(“VALUE.ARRAY”)中的XElement valueArray)
{
dt.Rows.Add(新对象[]){
messageId,
版本
网址,
类名,
结合
钥匙
(字符串)valueArray.Attribute(“名称”),
(字符串)valueArray.Element(“值”),
(字符串)valueArray.Element(“DisplayValue”)
});
}
foreach(instance.Elements中的XElement属性(“属性”))
{
dt.Rows.Add(新对象[]){
messageId,
版本
网址,
类名,
结合
钥匙
(字符串)property.Attribute(“名称”),
(字符串)property.Element(“值”),
(字符串)property.Element(“DisplayValue”)
});
}
}
}
}
}
我用来测试的xml

<?xml version="1.0"?>
<CIM CIMVERSION="2.0" DTDVERSION="2.0">
  <MESSAGE ID="4711" PROTOCOLVERSION="1.0">
    <SIMPLEREQ>
      <VALUE.NAMEDINSTANCE xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <INSTANCENAME CLASSNAME="DCIM_ControllerView">
          <KEYBINDING NAME="InstanceID">
            <KEYVALUE VALUETYPE="string">RAID.Slot.1-1</KEYVALUE>
          </KEYBINDING>
        </INSTANCENAME>
        <INSTANCE CLASSNAME="DCIM_ControllerView">
          <PROPERTY NAME="DriverVersion" TYPE="string">
            <DisplayValue/>
          </PROPERTY>
          <PROPERTY NAME="KeyID" TYPE="string">
            <DisplayValue/>
          </PROPERTY>
          <PROPERTY NAME="SASAddress" TYPE="string">
            <VALUE>5782BCB00C577600</VALUE>
            <DisplayValue>5782BCB00C577600</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="ProductName" TYPE="string">
            <VALUE>PERC H310 Adapter</VALUE>
            <DisplayValue>
              PERC
              H310 Adapter
            </DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="DeviceCardSlotType" TYPE="string">
            <VALUE>PCI Express x8</VALUE>
            <DisplayValue>
              PCI Express
              x8
            </DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="DeviceCardManufacturer" TYPE="string">
            <VALUE>DELL</VALUE>
            <DisplayValue>DELL</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="PCISubDeviceID" TYPE="string">
            <VALUE>1F4E</VALUE>
            <DisplayValue>1F4E</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="PCIDeviceID" TYPE="string">
            <VALUE>73</VALUE>
            <DisplayValue>73</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="PCISubVendorID" TYPE="string">
            <VALUE>1028</VALUE>
            <DisplayValue>1028</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="PCIVendorID" TYPE="string">
            <VALUE>1000</VALUE>
            <DisplayValue>1000</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="Function" TYPE="string">
            <VALUE>0</VALUE>
            <DisplayValue>0</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="Device" TYPE="string">
            <VALUE>0</VALUE>
            <DisplayValue>0</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="Bus" TYPE="string">
            <VALUE>1</VALUE>
            <DisplayValue>1</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="ControllerFirmwareVersion" TYPE="string">
            <VALUE>20.10.1-0066</VALUE>
            <DisplayValue>
              20.10.1-
              0066
            </DisplayValue>
          </PROPERTY>
        </INSTANCE>
      </VALUE.NAMEDINSTANCE>
      <VALUE.NAMEDINSTANCE xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <INSTANCENAME CLASSNAME="DCIM_ControllerView">
          <KEYBINDING NAME="InstanceID">
            <KEYVALUE VALUETYPE="string">RAID.Slot.1-1</KEYVALUE>
          </KEYBINDING>
        </INSTANCENAME>
        <INSTANCE CLASSNAME="DCIM_ControllerView">
          <PROPERTY NAME="DriverVersion" TYPE="string">
            <DisplayValue/>
          </PROPERTY>
          <PROPERTY NAME="KeyID" TYPE="string">
            <DisplayValue/>
          </PROPERTY>
          <PROPERTY NAME="SASAddress" TYPE="string">
            <VALUE>5782BCB00C577600</VALUE>
            <DisplayValue>5782BCB00C577600</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="ProductName" TYPE="string">
            <VALUE>PERC H310 Adapter</VALUE>
            <DisplayValue>
              PERC
              H310 Adapter
            </DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="DeviceCardSlotType" TYPE="string">
            <VALUE>PCI Express x8</VALUE>
            <DisplayValue>
              PCI Express
              x8
            </DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="DeviceCardManufacturer" TYPE="string">
            <VALUE>DELL</VALUE>
            <DisplayValue>DELL</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="PCISubDeviceID" TYPE="string">
            <VALUE>1F4E</VALUE>
            <DisplayValue>1F4E</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="PCIDeviceID" TYPE="string">
            <VALUE>73</VALUE>
            <DisplayValue>73</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="PCISubVendorID" TYPE="string">
            <VALUE>1028</VALUE>
            <DisplayValue>1028</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="PCIVendorID" TYPE="string">
            <VALUE>1000</VALUE>
            <DisplayValue>1000</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="Function" TYPE="string">
            <VALUE>0</VALUE>
            <DisplayValue>0</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="Device" TYPE="string">
            <VALUE>0</VALUE>
            <DisplayValue>0</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="Bus" TYPE="string">
            <VALUE>1</VALUE>
            <DisplayValue>1</DisplayValue>
          </PROPERTY>
          <PROPERTY NAME="ControllerFirmwareVersion" TYPE="string">
            <VALUE>20.10.1-0066</VALUE>
            <DisplayValue>
              20.10.1-
              0066
            </DisplayValue>
          </PROPERTY>
        </INSTANCE>
      </VALUE.NAMEDINSTANCE>

    </SIMPLEREQ>
  </MESSAGE>
</CIM>

RAID.Slot.1-1
5782BCB00C577600
5782BCB00C577600
PERC H310适配器
PERC
H310适配器
PCI Express x8
PCI Express
x8
戴尔
戴尔
1F4E
1F4E
73
73
1028
1028
1000
1000
0
0
0
0
1.
1.
20.10.1-0066
20.10.1-
0066
RAID.Slot.1-1
5782BCB00C577600
5782BCB00C577600
PERC H310适配器
PERC
H310适配器
PCI Express x8
PCI Express
x8
戴尔
戴尔
1F4E
1F4E
73
73
1028
1028
1000
1000
0
0
0
0
1.
1.
20.10.1-0066
20.10.1-
0066

您能说明它是如何分解的吗?不幸的是,数据本身是敏感的。然而,本文中的硬件清单数据解释了这一点:您可以按照自己认为合适的方式对数据进行审查,需要一个最小、完整且可验证的示例:@hellyale我提供的图片有帮助吗?DataSet ReadXml方法仅适用于有限数量的子体。该方法使用根标记作为数据集