Linq读取XML如何解析这个?

时间:2011-11-29 22:27:18

标签: xml linq

这是我正在尝试解析的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);
    }

我将如何解析这个?

1 个答案:

答案 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循环更易于管理。