我需要将XML值存储到数据库的两个不同的表中。
现在我正在使用LINQ,但是我不能让它像我想要的那样工作。
这是XML:
<?xml version="1.0" encoding="utf-8" ?>
<nfeProc xmlns="http://www.tst.com">
<NFe xmlns="http://www.tst.com">
<infNFe Id="409" versao="2.00">
<ide>
<cUF>43</cUF>
<cNF>00011740</cNF>
</ide>
<emit>
<GGT>0483</GGT>
</emit>
<det nItem="1">
<prod>
<cProd>27</cProd>
<NCM>85437099</NCM>
</prod>
</det>
<det nItem="2">
<prod>
<cProd>30</cProd>
<NCM>85457099</NCM>
</prod>
</det>
</infNFe>
</NFe>
</nfeProc>现在,我使用以下代码:
XDocument xml = XDocument.Load(@file);
XNamespace a = "http://www.portalfiscal.inf.br/nfe";
var NFe = from data in xml.Descendants(a + "nfeProc")
select new
{
cUF = (string)data.Elements(a + "NFe").Elements(a + "infNFe").Elements(a + "ide").Elements(a + "cUF").FirstOrDefault(),
nNF = (string)data.Elements(a + "NFe").Elements(a + "infNFe").Elements(a + "ide").Elements(a + "nNF").FirstOrDefault(),
};
var Prod = from Produto in xml.Descendants(a + "det")
select new
{
cProd = (string)Produto.Elements(a + "prod").Elements(a + "cProd").FirstOrDefault(),
NCM = (string)Produto.Elements(a + "prod").Elements(a + "NCM").FirstOrDefault(),
};
foreach (var nf in NFe)
{
}
foreach (var p in prod)
{
}然后我使用ADO.NET发送到数据库。但是我只想在一个foreach中执行,所以我可以使用SQL Server中的OUTPUT子句来关联这两个集合(从表1中获取ID (NFe)和插入到表2中(Prod))。我如何才能做到这一点。我尝试了很多东西都没有成功。我试过其中一个:
var NFe from data in xml.Descendants(a + "nfeProc")
select new {}...但是这样我只能得到一个"cProd“,而不是所有的。
其他方法也是受欢迎的。
谢谢。
编辑:
谢谢你的回答,但实际上我只是简单地改变了我的foreach。
foreach (var nf in NFe)
{
foreach (var p in prod)
{
}
}这样,我就可以使用cmd.ExecuteScalar()从我的第一个foreach中获取OUTPUT.ID,并在第二个foreach中的下一个插入中使用它。
发布于 2014-10-25 16:02:47
另一种表达var Prod的方式是
var Prod = xml.Descendants(a + "cProd")
.Select(x => new
{
cProd = (string)x,
NCM = (string)x.Parent.Element(a + "NCM")
});或者,如果您完全知道NCM节点会跟随cProd节点
NCM = (string)(XElement)x.NextNode发布于 2014-10-25 16:41:53
我猜这是从.Net 1.1开始就有了,现在已经不流行了,但是你可以:

DataSet.ReadXml重载执行read xml into a dataset,并使用该重载将其持久化到数据库或数据绑定。https://stackoverflow.com/questions/26559345
复制相似问题