[英]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.