首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XML to Object to Database

XML to Object to Database
EN

Stack Overflow用户
提问于 2014-10-25 12:30:36
回答 2查看 193关注 0票数 1

我需要将XML值存储到数据库的两个不同的表中。

现在我正在使用LINQ,但是我不能让它像我想要的那样工作。

这是XML:

代码语言:javascript
复制
  <?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>

现在,我使用以下代码:

代码语言:javascript
复制
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))。我如何才能做到这一点。我尝试了很多东西都没有成功。我试过其中一个:

代码语言:javascript
复制
var NFe from data in xml.Descendants(a + "nfeProc")
               select new {}...

但是这样我只能得到一个"cProd“,而不是所有的。

其他方法也是受欢迎的。

谢谢。

编辑:

谢谢你的回答,但实际上我只是简单地改变了我的foreach。

代码语言:javascript
复制
   foreach (var nf in NFe)
   {
       foreach (var p in prod)
       { 

       }
   }

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

EN

回答 2

Stack Overflow用户

发布于 2014-10-25 16:02:47

另一种表达var Prod的方式是

代码语言:javascript
复制
var Prod = xml.Descendants(a + "cProd")
              .Select(x => new
              {
                 cProd = (string)x,
                 NCM = (string)x.Parent.Element(a + "NCM")
              });

或者,如果您完全知道NCM节点会跟随cProd节点

代码语言:javascript
复制
NCM = (string)(XElement)x.NextNode
票数 0
EN

Stack Overflow用户

发布于 2014-10-25 16:41:53

我猜这是从.Net 1.1开始就有了,现在已经不流行了,但是你可以:

  1. 根据您的xml文件创建一个架构。在没有任何手动干预的情况下(没有元素重组、类型或名称空间定制),如下所示:

  1. Generate a strongly typed dataset out of your xsd.或者,您可以使用xsd的/c开关代替/d并生成类,而不是类型化的dataset。无论哪种方式,您都可以免费获得一个数据访问层。您可以使用其中一个DataSet.ReadXml重载执行read xml into a dataset,并使用该重载将其持久化到数据库或数据绑定。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26559345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档