XDocument получает XML-элемент по значению его атрибута name
У меня есть результат 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
Я пробовал что-то вроде этого, но это не так, потому что я получаю их все NULL
var test = from c in xml.Descendants("doc")
select new
{
firstname = c.Element("ContaFirstname"),
surnmane = c.Element("ContaSurname")
};
Итак, как получить доступ к этим элементам по имени?
Ответы
Ответ 1
Вы не хотите получать доступ к элементам по имени, поскольку большинство людей интерпретирует этот оператор. Вы хотите получить доступ к элементам по значению их атрибута 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
};
Если у вас есть шанс дать вашему документу более разумную структуру, это было бы предпочтительнее...
Ответ 2
Помогает ли это решить вашу проблему:
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
};