XElement to Dictionary具有相同的键替代

时间:2013-04-03 19:19:49

标签: c# xml

我有像这样的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>

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

2 个答案:

答案 0 :(得分: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的调用,因此它对空值更具弹性。

答案 1 :(得分: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
  }

}