XDocument通过其name属性的值获取XML元素

kba*_*che 18 c# xml linq-to-xml

我有这样的XML结果

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">16</int>
  </lst>
  <result name="response" numFound="3" start="0" maxScore="1.0">
    <doc>
      <str name="ContaFirstname">
        firstname1                                                   
      </str>
      <str name="ContaId">6557</str>
      <str name="ContaJobTitle">Manager</str>
      <str name="ContaSurname">surname1
      </str>
    </doc>
    <doc>
      <str name="ContaFirstname">firstname2</str>
      <str name="ContaId">6203</str>
      <str name="ContaJobTitle">Director</str>
      <str name="ContaSurname">surname2</str>
    </doc>
  </result>
</response>
Run Code Online (Sandbox Code Playgroud)

我想获得对象的列表,每个对象将包含的价值ContaFirstname,ContaId,ContaJobTitleContaSurname

我试过这样的东西,但这不对,因为我把它们都弄得一团糟

var test = from c in xml.Descendants("doc")
                    select new 
                    {
                        firstname = c.Element("ContaFirstname"),
                        surnmane = c.Element("ContaSurname")
                    }; 
Run Code Online (Sandbox Code Playgroud)

那么如何通过名称访问这些元素呢?

Jon*_*eet 32

您不希望按名称访问元素,因为大多数人会解释该语句.您希望通过其name属性的值访问元素:

firstname = (string) c.Elements("str")
                      .First(x => x.Attribute("name").Value == "ContaFirstname");
//etc
Run Code Online (Sandbox Code Playgroud)

您可能希望将其抽象为一个单独的方法,因为多次执行它会很麻烦.例如:

public static XElement ElementByNameAttribute(this XContainer container,
                                              string name)
{
    return container.Elements("str")
                    .First(x => x.Attribute("name").Value == name);
}
Run Code Online (Sandbox Code Playgroud)

然后:

var test = from c in xml.Descendants("doc")
           select new 
           { 
               firstname = c.ElementByNameAttribute("ContaFirstname").Value,
               surnmane = c.ElementByNameAttribute("ContaSurname").Value
           }; 
Run Code Online (Sandbox Code Playgroud)

如果您有机会为您的文档提供更合理的结构,那将更可取......

  • 你忘了```中的`>`(x => x.Attribute("name").值== name);`? (4认同)