我有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>
我想获取一个对象列表,每个对象都包含ContaFirstname
,ContaId
,ContaJobTitle
和ContaSurname
我尝试了类似这样的东西,但那不对,因为我把它们都弄为空
var test = from c in xml.Descendants("doc")
select new
{
firstname = c.Element("ContaFirstname"),
surnmane = c.Element("ContaSurname")
};
那么如何按名称访问这些元素?
答案 0 :(得分:32)
您不希望通过 name 访问元素,因为大多数人会解释该语句。您希望按name
属性的值访问元素:
firstname = (string) c.Elements("str")
.First(x => x.Attribute("name").Value == "ContaFirstname");
//etc
您可能希望将其抽象为单独的方法,因为多次执行此操作会很麻烦。例如:
public static XElement ElementByNameAttribute(this XContainer container,
string name)
{
return container.Elements("str")
.First(x => x.Attribute("name").Value == name);
}
然后:
var test = from c in xml.Descendants("doc")
select new
{
firstname = c.ElementByNameAttribute("ContaFirstname").Value,
surnmane = c.ElementByNameAttribute("ContaSurname").Value
};
如果您有机会为您的文档提供更合理的结构,那将更可取......
答案 1 :(得分:3)
这是否解决了您的问题:
var test = from c in xml.Descendants("doc")
select new
{
firstname = c.Elements("str").First(element => element.Attribute("name").Value == "ContaFirstname"),
surnmane = c.Elements("str").First(element => element.Attribute("name").Value == "ContaSurname")
};
或者,如果您想要值(而不是XElement
:
var test = from c in xml.Descendants("doc")
select new
{
firstname = c.Elements("str").First(element => element.Attribute("name").Value == "ContaFirstname").Value,
surnmane = c.Elements("str").First(element => element.Attribute("name").Value == "ContaSurname").Value
};