簡體   English   中英

使用LINQ獲取XML節點

[英]Getting an XML node using LINQ

不知何故,使用linq我在一開始就無法使用此CUF字段對其進行測試:

<NFe>
    <infNFe versao="1.0" Id="NFe0000000000">
        <ide>
             <cUF>35</cUF>
             <!--...-->
        </ide>
    </infNFe>
</NFe>

使用以下代碼:

XDocument document = XDocument.Load(@"c:\nota.xml");
            var query = from NFe in document.Descendants("NFe")
                        select new
                        {
                            cuf = NFe.Element("infNFe").Element("ide").Element("cUF").Value
                        };

整個XML都加載到文檔中(已選中),但NFe.cuf沒有給我任何幫助。 我想節點內部的參數搞砸了..

如何使用linq獲得此“ cuf”?
如果我想要infNFe中的Id參數怎么辦?

- [編輯] -

我忘了在開頭輸入“愚蠢的URL”,發生的是它是NAMESPACE(在Firefox中未顯示XML名稱空間)

現在這有效:

        XNamespace ns = "http://www.portalfiscal.inf.br/nfe";
        XElement root = XElement.Load(@"c:\nota.xml");

        textBox1.Text = root.Element(ns + "infNFe").Element(ns + "ide").Element(ns + "cUF").Value;

有沒有一種方法可以在某處設置名稱空間,而不必將其放置在每個字段調用中?

您實際上並不需要完整的LINQ查詢-只需一個單行即可:

string cuf = document.Root.Element("infNFe").Element("ide").Element("cUF").Value;
// cuf = 35

ID相同:

string id = document.Root.Element("infNFe").Attribute("Id").Value;
// id = NFe0000000000

您正在查看document.Descendants,它是根目錄中的所有元素。

document.Descendants在您的情況下將包含infNFe,ide,cuF ...這就是為什么您無法在集合中找到根的原因。

嘗試改用document.Root。

您可以使用XPath:

using System;
using System.Xml.Linq;
using System.Xml.XPath;

class Program
{
    static void Main(string[] args)
    {
        var doc = XDocument.Load(@"c:\nota.xml");
        var cuf = doc.XPathSelectElement("//cUF");
        if (cuf != null)
        {
            Console.WriteLine(cuf.Value);
        }

        var infNFe = doc.XPathSelectElement("//infNFe");
        if (infNFe != null)
        {
            var id = infNFe.Attribute("Id");
            if (id != null) 
            {
                Console.WriteLine(id.Value);
            }
        }

    }
}

鑒於此XML:

<?xml version="1.0"?>
<NFe>
  <infNFe versao="1.0" Id="NFe0000000000">
    <ide>
      <cUF>35</cUF>
    </ide>
  </infNFe>
</NFe>

嘗試query.SingleOrDefault();

實際上,在運行代碼時,我看不到任何問題。 我已經完成了以下工作:

XDocument document = XDocument.Load(@"c:\temp\nota.xml");
var query = from NFe in document.Descendants("NFe")
            select new
            {
                cuf = NFe.Element("infNFe").Element("ide").Element("cUF").Value,
                infId = NFe.Element("infNFe").Attribute("Id").Value
            };

foreach(var v in query)
    Console.WriteLine(v.cuf + " " + v.infId);

給定以下xml:

<NFe> 
<infNFe versao="1.0" Id="NFe0000000000"> 
<ide> 
<cUF>35</cUF> 
</ide>
</infNFe>
</NFe> 

它輸出:

35 NFe0000000000

編輯:使用XElement,這要容易得多。

現在您正在使用名稱空間,因此您也需要使用XNamespace指定它們

如果不確定在哪里中斷,只需將查詢分成多行,如下所示,以便逐步執行並確定錯誤發生的位置。

XNamespace ns = "http://www.somewebsite.com";
XElement root = XElement.Load(@"c:\nota.xml");
var infNFe = root.Element(ns + "infNFe");
var ide = infNFe.Element(ns + "ide");
var cUF = ide.Element(ns + "cUF");
var value = cUF.Value;

為了澄清名稱空間問題,如果您有類似XML

<a xmlns="namespace">
    <b>123</b>
</a>

a.Element("b")不存在。 您需要使用命名namespace詢問元素b。 就像C#中其他任何地方的名稱空間一樣,它們就像維度。 您正在尋找正確的道路,但方向錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM