C# 将XML数据集数据表合并到一个数据表中
我需要使用C#解析XML文档,以便将数据输入数据库 目前,我正在使用SSIS和此C#代码将文档读入数据集: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分解为多个具有关系的表。有没有一种方
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方法仅适用于有限数量的子体。该方法使用根标记作为数据集