Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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#_Xml_Linq - Fatal编程技术网

C# 动态地将XML读入数据表

C# 动态地将XML读入数据表,c#,xml,linq,C#,Xml,Linq,我有以下xml字符串,我正试图根据一组动态列查询到datatable中。我对xml没有任何控制权,它是从外部源传入的 XML: 我需要将其读入如下表格: AdjusterEmail EmpCode SOJ DOI GPI BlockCode STEPHAN.WILLIAMS@example.COM 00000016 OH 20131006 75100012333720 75*ndc STEPHAN.WILLIA

我有以下xml字符串,我正试图根据一组动态列查询到datatable中。我对xml没有任何控制权,它是从外部源传入的

XML:

我需要将其读入如下表格:

AdjusterEmail                 EmpCode   SOJ  DOI       GPI             BlockCode
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  75100012333720  75*ndc
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  75100012333720  76*ndc
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  12345678901234  75*ndc
每个MessageBody可以有多个详细记录,每个详细信息可以有多个块记录


我真的不知道从哪里开始,我尝试了很多不同的方法,包括linq(我不知道),但无法解决这个问题…

您可以简单地使用下面的方法并将xml文件路径作为输入传递

 DataSet ds = new DataSet();
 ds.ReadXml("Your File Path");
您将拥有一个数据集,其中包含xml的各个数据集对象。

它可以工作:

 XDocument xd = null;
        using (StreamReader oReader = new StreamReader(xmlFilePath, Encoding.GetEncoding("ISO-8859-1")))
        {
            xd = XDocument.Load(oReader);
        }

 var records = from root in xd.Descendants("MessageBody")
                      from details in root.Elements("Details").Elements("Detail")
                      select new
                      {
                          AdjusterEmail = root.Element("AdjusterEmail").Value,
                          EmpCode = root.Element("MasterCarrierInfo").Element("EmployerCode").Value,
                          SOJ = root.Element("SOJ").Value,
                          DOI = root.Element("DOI").Value,
                          GPI = details.Element("GPI").Value,
                          BlockCode = details.Element("Blocks").Element("Block").Element("BlockCode").Value

                      };
创建数据表以保存记录:

        DataTable dt = new DataTable();
        dt.Columns.Add("AdjusterEmail", typeof(string));
        dt.Columns.Add("EmpCode", typeof(string));
        dt.Columns.Add("SOJ", typeof(string));
        dt.Columns.Add("DOI", typeof(string));
        dt.Columns.Add("GPI", typeof(string));
        dt.Columns.Add("BlockCode", typeof(string));

        DataRow dr = null;
        foreach (var readValue in records)
        {
            dr = dt.NewRow();
            dr["AdjusterEmail"] = readValue.AdjusterEmail;
            dr["EmpCode"] = readValue.EmpCode;
            dr["SOJ"] = readValue.SOJ;
            dr["DOI"] = readValue.DOI;
            dr["GPI"] = readValue.GPI;
            dr["BlockCode"] = readValue.BlockCode;
            dt.Rows.Add(dr);
         }
dt包含以下内容:

AdjusterEmail              EmpCode   SOJ  DOI       GPI             BlockCode
STEPHAN.WILLIAMS@COMP.COM  00000016  OH   20131006  75100012333720  75*ndc
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  75100012333720  76*ndc
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  12345678901234  75*ndc

尝试在以下步骤中使用:您可以在SQL Server中将整个XML blob作为XML字段传递给它,然后使用XQuery从传入的XML变量中进行选择,并使用该select语句在表中插入适当的值:@Jonathan Fields您已解算它了吗?尚未解算它,下面的解决方案只是带回一条记录。每个messagebody可以有多个详细信息,每个详细信息可以有多个块。请参阅上面更新的xml和更新的输出。这仍然只是带回一条记录。每个messagebody可以有多个详细信息,每个详细信息可以有多个块。请参阅上面编辑的xml。此外,字段列表是动态的,我正在从数据库中读取它们,因此下次可能会有其他字段或更少的字段。
        DataTable dt = new DataTable();
        dt.Columns.Add("AdjusterEmail", typeof(string));
        dt.Columns.Add("EmpCode", typeof(string));
        dt.Columns.Add("SOJ", typeof(string));
        dt.Columns.Add("DOI", typeof(string));
        dt.Columns.Add("GPI", typeof(string));
        dt.Columns.Add("BlockCode", typeof(string));

        DataRow dr = null;
        foreach (var readValue in records)
        {
            dr = dt.NewRow();
            dr["AdjusterEmail"] = readValue.AdjusterEmail;
            dr["EmpCode"] = readValue.EmpCode;
            dr["SOJ"] = readValue.SOJ;
            dr["DOI"] = readValue.DOI;
            dr["GPI"] = readValue.GPI;
            dr["BlockCode"] = readValue.BlockCode;
            dt.Rows.Add(dr);
         }
AdjusterEmail              EmpCode   SOJ  DOI       GPI             BlockCode
STEPHAN.WILLIAMS@COMP.COM  00000016  OH   20131006  75100012333720  75*ndc
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  75100012333720  76*ndc
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  12345678901234  75*ndc