C# 将XML解析为数据表
我有以下XML:C# 将XML解析为数据表,c#,.net,xml,C#,.net,Xml,我有以下XML: <RECORDS> <RECORD> <PROPERTY NAME="FNAME" TYPE="string"></PROPERTY> <PROPERTY NAME="LNAME" TYPE="string"> <VALUE>SMITH</VALUE> </PROPERTY> <PROPERTY NAME="ZIP" TYPE="
<RECORDS>
<RECORD>
<PROPERTY NAME="FNAME" TYPE="string"></PROPERTY>
<PROPERTY NAME="LNAME" TYPE="string">
<VALUE>SMITH</VALUE>
</PROPERTY>
<PROPERTY NAME="ZIP" TYPE="string">
<VALUE></VALUE>
</PROPERTY>
<PROPERTY NAME="PHONE" TYPE="string">
<VALUE>5551212</VALUE>
</PROPERTY>
</RECORD>
<RECORD>
....
</RECORD>
<RECORD>
....
</RECORD>
<RECORD>
....
</RECORD>
</RECORDS>
史密斯
5551212
....
....
....
“记录”下可能有1000个“记录”节点。我试图简单地将每条记录转储到一个数据行中(或将整个记录转储到一个数据表中)。我很乐意把所有的“值”都放到每一行的列中。在C#中有没有一种有效的方法可以做到这一点?执行foreach()并一次访问一个属性似乎非常慢
我想它可能会涉及Row.ItemArray或者XMLArray或者类似的东西
有兴趣看到一个很好的解决方案 试试这个
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
{
static void Main(string[] args)
{
string xml =
"<RECORDS>" +
"<RECORD>" +
"<PROPERTY NAME=\"FNAME\" TYPE=\"string\"></PROPERTY>" +
"<PROPERTY NAME=\"LNAME\" TYPE=\"string\">" +
"<VALUE>SMITH</VALUE>" +
"</PROPERTY>" +
"<PROPERTY NAME=\"ZIP\" TYPE=\"string\">" +
"<VALUE></VALUE>" +
"</PROPERTY>" +
"<PROPERTY NAME=\"PHONE\" TYPE=\"string\">" +
"<VALUE>5551212</VALUE>" +
"</PROPERTY>" +
"</RECORD>" +
"</RECORDS>";
XDocument doc = XDocument.Parse(xml);
DataTable dt = new DataTable();
List<XElement> properties = doc.Descendants("PROPERTY").ToList();
//add columns to table
foreach (XElement property in properties)
{
string name = property.Attribute("NAME").Value;
string _type = property.Attribute("TYPE").Value;
if(!dt.Columns.Contains(name))
{
dt.Columns.Add(name, Type.GetType("System." + _type, false, true));
}
}
//add rows to table
foreach(XElement record in doc.Descendants("RECORDS").ToList())
{
DataRow newRow = dt.Rows.Add();
foreach (XElement property in properties)
{
string name = property.Attribute("NAME").Value;
Type _type = Type.GetType("System." + property.Attribute("TYPE").Value, false, true);
string value = property.Value;
switch (_type.ToString())
{
case "System.String" :
newRow[name] = (string)value;
break;
case "System.Int" :
newRow[name] = int.Parse(value);
break;
}
}
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串xml=
"" +
"" +
"" +
"" +
“史密斯”+
"" +
"" +
"" +
"" +
"" +
"5551212" +
"" +
"" +
"";
XDocument doc=XDocument.Parse(xml);
DataTable dt=新的DataTable();
列表属性=doc.substands(“属性”).ToList();
//向表中添加列
foreach(属性中的XElement属性)
{
字符串名称=property.Attribute(“name”).Value;
字符串_type=property.Attribute(“type”).Value;
如果(!dt.Columns.Contains(name))
{
Add(name,Type.GetType(“System.+\u Type,false,true));
}
}
//向表中添加行
foreach(doc.subscriptions(“记录”).ToList()中的XElement记录)
{
DataRow newRow=dt.Rows.Add();
foreach(属性中的XElement属性)
{
字符串名称=property.Attribute(“name”).Value;
Type _Type=Type.GetType(“系统”)+属性.Attribute(“类型”).Value,false,true);
字符串值=property.value;
开关(_type.ToString())
{
案例“System.String”:
newRow[name]=(字符串)值;
打破
案例“System.Int”:
newRow[name]=int.Parse(值);
打破
}
}
}
}
}
}
如果要选择数据集路径,请尝试:var DataSet=new DataSet();ReadXml(xmlVariable);什么是“非常慢”?基本上,您必须遍历每个记录才能将其从XML转换为数据行,因此,foreach
本身肯定不是问题。使用ReadXML可能有效,但我不清楚如何告诉它结构。如果您注意到,列名是属性的属性,值是值的内部文本(如果存在)。“非常慢”。。。执行foreach(记录),然后嵌套foreach(属性),可能需要20-30秒来解析800条记录。800条记录,20个属性=16000步(至少)。如果你能让我知道你的最终目标,我想我能帮上忙。因为,如果它类似于根据某些标准获取某些节点的值,那么即使将整个XML放入数据库并获取值也不会花费太多时间。此外,如果最终目标是在页面上显示这些数据,则可能不需要编写太多循环,因为这也可以使用XSLT来完成。