Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 使用Linq将xml转换为类_C#_Linq - Fatal编程技术网

C# 使用Linq将xml转换为类

C# 使用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

我正在使用LINQ将XML文件转换为我创建的类。无论我在尝试什么,我都会在列表计数中得到0

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:不-如果必须的话,请问一个新问题,如下所示