簡體   English   中英

c#LINQ從XElement獲取屬性值

[英]c# LINQ get Attribute value from XElement

我在數據定義文件中包含以下XML:

<PQTemplate documentID="CSTrlsEN" documentType="TransList" templateID="001" 
        templateType="Customer Copy" 
        templateName="C:\CPS\_templates\Mini-Statements\CSTrlsEN.doc">  
<field pos="5" name="YPTME" descr="Time"  />
<field pos="6" name="YPDTE" descr="Action Date"  />
<field pos="7" name="YPBRNO" descr="Branch Number"  />
<field pos="8" name="YPBNA" descr="Branch Name"  />
<field pos="9" name="YPTID" descr="Teller ID"  />
<field pos="10" name="YPISN" descr="Teller Sequence"  />
<field pos="11" name="YPREF" descr="Customer Reference"  />
<field pos="12" name="YPCUS" descr="Customer Name"  />
<field pos="13" name="YPEAN" descr="Account Number"  />
<field pos="14" name="YPATY" descr="Account Type"  />
<field pos="15" name="YPCUR" descr="Currency"  />
<field pos="16" name="YPBAL" descr="Available Balance"  />

我使用LINQ獲得了特定的XElement,並使用下面的LINQ表達式從包含幾個PQTemplate元素的XML文件中提取了它:

var mapInfo = from nm in XElement.Elements("PQTemplate")
                where (string)nm.Attribute("documentID") == sRequests[0].Split('\t')[0] 
                select nm;    

現在,我需要獲取屬性documentType的值,因此嘗試了以下LINQ表達式:

var repName = from d in mapInfo.Attributes("documentType")
                     select d.Value;

reportName = repName.ToString();

不幸的是,盡管我看到TransList值是reportName元素的一部分,但是我沒有運氣嘗試檢索它。

這是在VS 2013中顯示的圖片:

在此處輸入圖片說明

那么如何獲取元素中的documentType屬性呢?

這是因為repName將返回IEnumerable<string>所有mapInfo

IEnumerable<string> repName = from d in mapInfo.Attributes("documentType")
                     select d.Value;

因此,如果懷疑可能會得到更多的值,請使用foreach循環,或者使用First來獲取第一個屬性,例如:

string reportName = mapInfo.First().Attribute("documentType").Value;

Linq查詢返回集合。 for each repName

repName.First().ToString()

如果這就是您所需要的。

您的解決方案取決於XML中存在DocumentType元素數量。 如果只有一個(我想),則可以使用repName.First().ToString()

如果該屬性可能出現多次,則應改為使用循環:

var result = new List<string>();
foreach(var a in (from d in mapInfo.Attributes("documentType") select d.Value) 
    result.Add(a.ToString());

甚至更短:

result = mapInfo.Attributes("documentType").Select(x => x.Value.ToString());

這將返回一個枚舉。

更改

var mapInfo = from nm in XElement.Elements("PQTemplate")
                where (string)nm.Attribute("documentID") == sRequests[0].Split('\t')[0] 
                select nm;   

var mapInfo = from nm in XElement.Elements("PQTemplate")
                where (string)nm.Attribute("documentID") == sRequests[0].Split('\t')[0] 
                select nm.Attribute("documentType").Value;   

然后mapInfo.First()將為您提供所需的值。

要從LINQ查詢中獲取單個值,您必須調用例如FirstFirstOrDefault 如果調用FirstOrDefault ,則在查詢未返回任何匹配FirstOrDefault它不會引發異常。

string repName =  doc.Elements("PQTemplate")
                     .Where(e => (string)a.Attribute("documentID") == sRequests[0].Split('\t')[0])
                     .Select(e => (string)e.Attribute("documentType"))
                     .FirstOrDefault();

另外,您不需要在XAttribute.Value上調用ToString() ,因為它已經是string

暫無
暫無

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

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