C# 使用Linq将xml转换为类
我正在使用LINQ将XML文件转换为我创建的类。无论我在尝试什么,我都会在列表计数中得到0C# 使用Linq将xml转换为类,c#,linq,C#,Linq,我正在使用LINQ将XML文件转换为我创建的类。无论我在尝试什么,我都会在列表计数中得到0 List updateMembers=new List(); updateMembers=GetMember(doc); 尝试 { IEnumerable member=来自doc.subscriptions(“UpdateMember”).subscriptions(“成员”)中的r 选择new UpdateMember() { Birthdate=(string)(r.Element(“Birthda
List updateMembers=new List();
updateMembers=GetMember(doc);
尝试
{
IEnumerable member=来自doc.subscriptions(“UpdateMember”).subscriptions(“成员”)中的r
选择new UpdateMember()
{
Birthdate=(string)(r.Element(“Birthdate”)==string.Empty?DateTimeParser((DateTime)(r.Element(“Birthdate”)):DateTime.Now,
Email=(字符串)r.Element(“Email”)!=null?(字符串)r.Element(“Email”):“”,
FamilyStatus=(字符串)r.Element(“FamilyStatus”)!=null?(字符串)r.Element(“FamilyStatus”):“”,
ID=(int)r.Element(“IdNumber”)!=0?(int)r.Element(“IdNumber”):0,
Phone1=(int)r.Element(“电话1”)!=0?(int)r.Element(“电话1”):0,
Phone2=(int)r.Element(“电话2”)!=0?(int)r.Element(“电话2”):0,
phone3=(int)r.Element(“电话3”)!=0?(int)r.Element(“电话3”):0
};
返回成员。ToList();
}
xml
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<UpdateMember xmlns="http://tempuri.org/">
<member>
<Birthdate>25122012</Birthdate>
<Email>fake@testing.com</Email>
<Familystatus>single</Familystatus>
<IdNumber>12345678</IdNumber>
<Telephone1>123-4567890</Telephone1>
<Telephone2></Telephone2>
<Telephone3></Telephone3>
</member>
</UpdateMember>
25122012
fake@testing.com
单一的
12345678
123-4567890
在文档Decentants(“”)中r的行中…
我尝试过各种变化。
感谢大家问题在于名称空间:
<UpdateMember xmlns="http://tempuri.org/">
这在LINQ to XML中很容易修复:
XNamespace ns = "http://tempuri.org/";
IEnumerable<UpdateMember> member = from r in doc.Descendants(ns + "UpdateMember")
.Descendants(ns + "member")
// etc
应该是:
Phone1 = (int?) r.Element(ns + "Telephone1") ?? 0
如果强制转换为int
,如果缺少值,则不会给出0
,而是会引发异常。强制转换为int?
将给出一个空值
我会将您的整个代码更改为:
return doc.Descendants(ns + "UpdateMember").Descendants(ns + "member")
.Select (r => new UpdateMember
{
// Really? This is an odd default.
Birthdate = (DateTime?) r.Element(ns + "Birthdate") ?? DateTime.Now,
Email = (string) r.Element(ns + "Email") ?? "",
FamilyStatus = (string) r.Element(ns + "Familystatus) ?? "",
ID = (int?) r.Element(ns + "IDNumber") ?? 0,
Phone1 = (int?) r.Element(ns + "Telephone1") ?? 0,
Phone2 = (int?) r.Element(ns + "Telephone2") ?? 0,
Phone3 = (int?) r.Element(ns + "Telephone3") ?? 0)
})
.ToList();
编辑:如评论中所述,将电话号码存储为
int
值是一个非常糟糕的主意。您将丢失任何格式,您将丢失前导零,而且我预计许多完整的电话号码将超出int
的范围。我会将它们保留为字符串。问题在于名称空间:
<UpdateMember xmlns="http://tempuri.org/">
这在LINQ to XML中很容易修复:
XNamespace ns = "http://tempuri.org/";
IEnumerable<UpdateMember> member = from r in doc.Descendants(ns + "UpdateMember")
.Descendants(ns + "member")
// etc
应该是:
Phone1 = (int?) r.Element(ns + "Telephone1") ?? 0
如果强制转换为int
,如果缺少值,则不会给出0
,而是会引发异常。强制转换为int?
将给出一个空值
我会将您的整个代码更改为:
return doc.Descendants(ns + "UpdateMember").Descendants(ns + "member")
.Select (r => new UpdateMember
{
// Really? This is an odd default.
Birthdate = (DateTime?) r.Element(ns + "Birthdate") ?? DateTime.Now,
Email = (string) r.Element(ns + "Email") ?? "",
FamilyStatus = (string) r.Element(ns + "Familystatus) ?? "",
ID = (int?) r.Element(ns + "IDNumber") ?? 0,
Phone1 = (int?) r.Element(ns + "Telephone1") ?? 0,
Phone2 = (int?) r.Element(ns + "Telephone2") ?? 0,
Phone3 = (int?) r.Element(ns + "Telephone3") ?? 0)
})
.ToList();
编辑:如评论中所述,将电话号码存储为
int
值是一个非常糟糕的主意。您将丢失任何格式,您将丢失前导零,而且我预计许多完整的电话号码将超出int
的范围。我会把它们作为字符串保存。你也可以发布你的XML吗?doc
看起来怎么样?也许你应该使用Member
而不是Member
?你为什么要写x!=0 ? x:0
?@Danny:检查0
并改用0
不会有任何作用。你也可以发布你的XML吗?那么doc
看起来怎么样?也许你应该用Member
而不是Member
?你为什么要写x!=0 ? x:0
?@Danny:检查0
并改用0
不会有任何作用。电话号码中的“-”不会导致强制转换异常吗?日期时间输入有问题,但我会解决。非常感谢much@Cory:如果电话号码中包含破折号,则为“是”。将电话号码存储在int
中肯定不是一个好主意,但这与这里的主要问题有些不同。Jon Skeet:我有一个新的xml,它也必须在类中。我有点麻烦,我可以发送xml吗?@Danny:不-如果必须,请问一个新问题,电话号码中的“-”是否会导致强制转换异常?datetime输入有问题,但我会解决。非常感谢much@Cory:如果电话号码中包含破折号,则为“是”。将电话号码存储在int
中肯定不是一个好主意,但这与这里的主要问题有些不同。Jon Skeet:我有一个新的xml,它也必须在类中。我有点麻烦,我可以发送xml吗?@Danny:不-如果必须的话,请问一个新问题,如下所示