【问题标题】:c# LINQ get Attribute value from XElementc#LINQ从XElement获取属性值
【发布时间】:2015-09-01 10:12:00
【问题描述】:

我在数据定义文件中有以下 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();

不幸的是,虽然我可以看到值 TransListreportName 元素的一部分,但我没有运气尝试检索它。

这是在 VS 2013 中显示的图片:

那么我怎样才能在元素中获得documentType 属性呢?

【问题讨论】:

    标签: c# xml linq xelement xattribute


    【解决方案1】:

    这是因为repName 将为所有mapInfo 返回一个IEnumerable&lt;string&gt;

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

    因此,如果您怀疑可能会获得更多值,请使用foreach 循环,或者使用First 来获取第一个属性,如下所示:-

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

    【讨论】:

      【解决方案2】:

      Linq 查询返回集合。在repName 上执行for each

      repName.First().ToString()
      

      如果这就是你所需要的。

      【讨论】:

        【解决方案3】:

        您的解决方案取决于您的 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());
        

        这将返回一个枚举。

        【讨论】:

          【解决方案4】:

          改变

          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() 会给你你想要的价值。

          【讨论】:

            【解决方案5】:

            要从 LINQ 查询中获取单个值,您必须调用例如 FirstFirstOrDefault。如果你调用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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-07-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-05-15
              • 1970-01-01
              相关资源
              最近更新 更多