繁体   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