XML到对象到数据库

时间:2014-10-25 04:30:36

标签: c# xml linq

我需要将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(NFe)获取ID,并将INSERT输入表2(Prod))。我怎样才能做到这一点。我尝试了很多没有成功的事情。我试过一个:

var NFe from data in xml.Descendants(a + "nfeProc")
               select new {}...

但是这样我才能得到一个&#34; cProd&#34;而不是所有人。

欢迎其他方法。

感谢。

编辑:

感谢您的回答,但实际上我让它只是改变我的foreach。

   foreach (var nf in NFe)
   {
       foreach (var p in prod)
       { 

       }
   }

这样我可以使用cmd.ExecuteScalar()从我的第一个foreach获取OUTPUT.ID,并在我的第二个foreach中的下一个INSERT中使用它。

2 个答案:

答案 0 :(得分:0)

另一种说出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

答案 1 :(得分:0)

自从.Net 1.1以来,这已经存在,我猜不再流行,但你可以:

  1. 从xml文件中创建架构。没有任何手动干预(没有元素重组,类型或名称空间自定义),这看起来像: XML->Create Schema
  2. Generate a strongly typed dataset out of your xsd。或者,您可以将/ c开关用于xsd而不是/ d,并生成类而不是类型化数据集。无论哪种方式,您都可以获得免费的数据访问层。您可以read xml into a dataset使用其中一个DataSet.ReadXml重载,并使用它来持久保存数据库或数据绑定。