读取XML LINQ时出错了

时间:2012-12-05 14:02:04

标签: c# xml linq linq-to-xml

这是我的源XML:

<?xml version="1.0" encoding="UTF-8"?>
<cteProc xmlns="http://www.portalfiscal.inf.br/cte" versao="1.04">
<CTe>
<infCte versao="1.04" Id="CTe35121004211559000111570010000118991000119858">
<ide>
     <cUF>35</cUF>
     <cCT>00011985</cCT>
     <CFOP>7358</CFOP>
     <natOp>PRESTACAO DE SERVICO DE TRANSPORTE</natOp>
     <forPag>1</forPag>
     <mod>57</mod>
     <serie>1</serie>
     <nCT>11899</nCT>
     <dhEmi>2012-10-01T09:34:45</dhEmi>
</ide>
<compl>
<emit>
<rem>
<dest>
<vPrest>
<imp>
<infCTeNorm>
</infCte>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
</CTe>
<protCTe versao="1.04">
</cteProc>

我已使用以下代码阅读此文件:

      XmlTextReader reader = new XmlTextReader(@"C:\Separados\56000858_v01.04-procCTe.xml");
        XmlNodeType type;
        while (reader.Read())
        {
            type = reader.NodeType;
            if (type == XmlNodeType.Element)
            {
                if (reader.Name == "cUF")
                {  reader.Read(); Xmunini = reader.Value; textBox1.Text = Xmunini;}

                if (reader.Name == "cCT")
                {  reader.Read(); vtprest = reader.Value; textBox2.Text = vtprest;}

                if (reader.Name == "natOp")
                {   reader.Read(); UFIni = reader.Value; textBox3.Text = UFIni; }

                if (reader.Name == "nCT")
                { reader.Read(); NCT = reader.Value; textBox4.Text = NCT;}

但是,我在这里看了很多帖子,LINQ的方法效率更高,我试着写一下:

    var custs45 = from c in XElement.Load(@"C:\Separados\56000858_v01.04-procCTe.xml").Elements("Cte")

    select new { 
    CFOP = c.Element("CFOP").Value,
    xMunIni = c.Element("xMunIni").Value 
    };

我的问题是如何将CFOP和Xmunini分配给变量?我写了这个,但没有显示任何东西

    string CFF;
    foreach (var valores in custs45)
    { 
      CFF = valores.CFOP.ToString() ;        
    }

1 个答案:

答案 0 :(得分:1)

您找不到节点,因为根节点已经过命名空间。这是解决方案:

XDocument xdoc = XDocument.Load(path_to_xml);
XNamespace ns = "http://www.portalfiscal.inf.br/cte";
string CFF = (string)xdoc.Descendants(ns + "CFOP").Single();

此外,您在CTe元素名称中输入了拼写错误。你遗憾CFOP不是CTe的直接孩子。并且xml中仍然没有xMunIni元素。

您的原始查询应如下所示:

XNamespace ns = "http://www.portalfiscal.inf.br/cte";
var custs45 = from ide in XElement.Load(path_to_xml).Descendants(ns + "ide")
              select new
              {
                  CFOP = (string)ide.Element(ns + "CFOP"),
                  xMunIni = (string)ide.Element(ns + "xMunIni")
              };