这是我正在尝试解析的XML。我在解析条目元素并获取其中的不同值时遇到问题。通常我可以指定我想要获取的元素并从中提取值。但是,这次我所针对的元素都具有相同的名称。
<?xml version="1.0" encoding="UTF-8"?>
<response id="-46056350:133f0f5eff1:54e3">
<userdata>
<account>
<account>23408234</account>
</account>
<disabled>false</disabled>
<resetpassword>false</resetpassword>
<userprofile>
<entry>
<name>primaryMiddleInitial</name>
<value/>
</entry>
<entry>
<name>primaryLastName</name>
<value>chen</value>
</entry>
<entry>
<name>login_id</name>
<value>Negative</value>
</entry>
<entry>
<name>zip</name>
<value/>
</entry>
<entry>
<name>primaryFirstName</name>
<value>eric</value>
</entry>
<entry>
<name>emailAddress1</name>
<value>ECHEN57@GMAIL.COM</value>
</entry>
</userprofile>
</userdata>
<error>Success</error>
</response>
这是我试图解析它。
public static MemberViewModel ParseMemberXML(string xml)
{
XDocument data = XDocument.Parse(xml);
return (from c in data.Descendants("userdata")
select new MemberViewModel()
{
Account = c.Element("account").Element("account").Value,
PrimaryFirstName = c.Element("userprofile").Element("entry").Element("value").Value
PrimaryLastName
PrimaryMiddleInitial
LoginID
}).ToList().ElementAt(0);
}
我将如何解析这个?
答案 0 :(得分:1)
最好的办法是迭代“entry”元素,并在发现它们时将它们的值分配给MemberViewModel对象的字段。
这样的事情:
public static MemberViewModel ParseMemberXML(string xml)
{
XDocument data = XDocument.Parse(xml);
// expecting exactly one
XElement userdata = data.Root.Element("userdata");
var obj = new MemberViewModel();
obj.Account = userdata.Element("account").Element("account").Value;
foreach (var entry in userdata.Element("userprofile").Elements("entry"))
{
switch (entry.Element("name").Value)
{
case "primaryFirstName": obj.PrimaryFirstName = entry.Element("value").Value; break;
case "primaryLastName": obj.PrimaryLastName = entry.Element("value").Value;
...etc...
}
}
return obj;
}
您可以使用XPath表达式通过指定其父级路径来选择单个元素,但坦率地说,我认为foreach循环更易于管理。