如何使用linq从IEnumerable <xelement>列表中获取单个XElement

时间:2016-07-27 14:23:18

标签: c#-4.0 linq-to-xml

<?xml version="1.0" encoding="utf-8" ?>
<Document>
  <State Code="A" Type="B">
    <Info>     
      <FirstName ripName="Hello"></FirstName>
      <LastName  ripName="Word"></LastName>
    </Info>
  </State>
</Document>

对于这个xml我试图使用linq获取FirstName属性值,如下面的代码片段,但我得到null。

IEnumerable<XElement> a1 = xmlData.Elements("State").Where(c => c.Attribute("Code").Value.Equals("A") && c.Attribute("Type").Value.Equals("B"))
                                    .Elements("Info");

var x1 = a1.Select(x => x.Element("FirstName").Attribute("ripName")).FirstOrDefault();

x1为空,请建议。

2 个答案:

答案 0 :(得分:1)

如果我认为xmlData是一个加载了您显示的xml的XDocument,那么主要问题在于:library(data.table) setDT(df)[, as.list(penultimate(unlist(.SD))), .(rn= 1:nrow(df))][, rn := NULL][] 为空。如果您想要“状态”元素,则应使用xmlData.Elements("State")...

并选择属性值,如下所示:

xmlData.Descendants("State")

或者

var x2 = a1.Select(x => x.Element("FirstName").Attribute("ripName")).FirstOrDefault().Value;

答案 1 :(得分:0)

在VB中,如果我理解你想要做什么,它会是这样的,

    Dim xe As XElement

    'to load from file
    '  xe=XElement.Load("your path here")

    'to test
    xe = <Document>
             <State Code="A" Type="B">
                 <Info>
                     <FirstName ripName="Hello"></FirstName>
                     <LastName ripName="World"></LastName>
                 </Info>
             </State>
         </Document>

    Dim ie As IEnumerable(Of XElement)

    ie = From el In xe.Elements
         Where el.@Code = "A" AndAlso el.@Type = "B"
            From sel In el.<Info>.Elements
            Where sel.Name.LocalName = "FirstName"
            Select sel Take 1

    Dim attrRN As XAttribute
    If ie.Count = 1 Then
        attrRN = ie.FirstOrDefault.Attribute("ripName")
        Debug.WriteLine(attrRN.Value)
    End If

这当然假设您已经给出了XML的准确描述。