1

我有一个这样的xml

<parent id="001">
    <first>Brian</first>
    <last>Johnson</last>
    <gender>Male</gender>
</parent>

我的代码目前这样处理它:

public Dictionary<string, string> GetParentInfo(string id, XDocument xml)
{
    var parent = xml.Descendants("parent")
                    .Where(p => p.Attribute("id").Value == id)
                    .FirstOrDefault();

    var parentInfo = parent.Elements()
                           .ToDictionary(x => x.Name.LocalName, x => X.Value);

    return parentInfo;
}

我的问题是我的 xml 现在更改为:

<parent id="001">
    <first>Brian</first>
    <last>Johnson</last>
    <gender>Male</gender>
    <child>Jimmy</child>
    <child>Janet</child>
    <child>Carl</child>
</parent>

字典不再合适,我想不出如何处理这种变化。

4

2 回答 2

1

我会像这样创建您的 Parent 类:

    private class Parent
    {
        public string Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Gender { get; set; }
        public IEnumerable<string> Children { get; set; }
    }

并有一个解析您的 xml 的工厂方法:

    private static Parent ParentInfo(string id, XDocument xml)
    {
        return xml.Descendants("parent")
                .Where(p => (string)p.Attribute("id") == id)
                .Select(x => new Parent {
                            FirstName = (string)x.Element("first"),
                            LastName = (string)x.Element("last"),
                            Gender = (string)x.Element("gender"),
                            Children = x.Elements("child").Select(y => (string)y)
                           })
                .FirstOrDefault();
    }

烦人的 xml 模式来解析。


编辑:使用强制转换而不是对 .Value 的调用,因此它对空值更具弹性。

于 2013-04-03T20:43:21.650 回答
0

如何为 Parent 编写一个类,然后为它编写一个构造函数,它接受一个 XElement 并将其解析为类的属性。你仍然可以保留字典,但它会是Dictionary<string, Parent>

public class Parent
{
  public string ID {get;set;}
  public string First {get;set;}
  public string Last {get;set;}
  public string Gender {get;set;}
  public List<string> ChildrensNames {get;set;}

  public Parent(XElement parentXML) { // parse XML and fill properties
  }

}
于 2013-04-03T19:56:47.323 回答