C# XElement到字典,具有相同的键可选
我有一个这样的xmlC# 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
<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();
}