C# 动态地将XML读入数据表
我有以下xml字符串,我正试图根据一组动态列查询到datatable中。我对xml没有任何控制权,它是从外部源传入的 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
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