Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XElement到字典,具有相同的键可选_C#_Xml - Fatal编程技术网

C# XElement到字典,具有相同的键可选

C# XElement到字典,具有相同的键可选,c#,xml,C#,Xml,我有一个这样的xml <parent id="001"> <first>Brian</first> <last>Johnson</last> <gender>Male</gender> </parent> 布瑞恩 约翰逊 男性 我的代码目前处理它的方式如下: public Dictionary<string, string> GetParentInfo(str

我有一个这样的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;
}
公共字典GetParentInfo(字符串id,XDocument xml) { var parent=xml.subjects(“父项”) .Where(p=>p.Attribute(“id”).Value==id) .FirstOrDefault(); var parentInfo=parent.Elements() .ToDictionary(x=>x.Name.LocalName,x=>x.Value); 返回parentInfo; } 我的问题是,我的xml现在变为:

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

布瑞恩
约翰逊
男性
吉米
珍妮特
卡尔

字典不再合适了,我想不出该如何处理这个变化

为父类编写一个类,然后为其编写一个构造函数,该构造函数接受一个XElement并将其解析为类上的属性。你仍然可以保留字典,但它将是
dictionary

公共类父类
{
公共字符串ID{get;set;}
第一个公共字符串{get;set;}
公共字符串Last{get;set;}
公共字符串{get;set;}
公共列表子名称{get;set;}
公共父级(XElement parentXML){//解析XML和填充属性
}
}

为父类编写一个类,然后为其编写一个构造函数,该构造函数接受一个XElement并将其解析为类上的属性。你仍然可以保留字典,但它将是
dictionary

公共类父类
{
公共字符串ID{get;set;}
第一个公共字符串{get;set;}
公共字符串Last{get;set;}
公共字符串{get;set;}
公共列表子名称{get;set;}
公共父级(XElement parentXML){//解析XML和填充属性
}
}

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

    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模式很烦人



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

我会像这样创建父类:

    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模式很烦人



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

我已经有了与您编写的完全相同的父类。我的问题是,我希望将XElement排除在类之外,以防将来我从XML更改为数据库,因此我尝试保留一些通用的东西,例如字典。您可以创建一个工厂类,它可以从XElement生成父类。那么父对象与XElement没有关联。谢谢您的帮助。我使用了一个
列表
,这似乎与我所得到的一致。我已经有了与您编写的完全相同的父类。我的问题是,我希望将XElement排除在类之外,以防将来我从XML更改为数据库,因此我尝试保留一些通用的东西,例如字典。您可以创建一个工厂类,它可以从XElement生成父类。那么父对象与XElement没有关联。谢谢您的帮助。我用了一个
列表
,这似乎与我所得到的相符。哦,嘿。。。这是个好主意。我没有想到这一点。我实际上也可以更改xml模式,有什么建议吗?我不怎么处理xml。我想这将是最简单的在
children
元素中捕获子元素,或者创建
parent
元素的第一个、最后一个和性别属性。哦,嘿。。。这是个好主意。我没有想到这一点。我实际上也可以更改xml模式,有什么建议吗?我不怎么处理xml。我认为这将是在
children
元素中最容易捕获子元素,或者创建
parent
元素的第一个、最后一个和性别属性。
    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();
    }