Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将XML解析为数据表_C#_.net_Xml - Fatal编程技术网

C# 将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="

我有以下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>
  <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来完成。