1

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

List<UpdateMember> updateMembers = new List<ExeTeam.UpdateMember>();
updateMembers = GetMember(doc);
try
{
  IEnumerable<UpdateMember> member = from r in doc.Descendants("UpdateMember").Descendants("member")
  select new UpdateMember()
  {
    Birthdate = (string)(r.Element("Birthdate")) == string.Empty ? DateTimeParser((DateTime)(r.Element("Birthdate"))) : DateTime.Now,
    Email = (string)r.Element("Email") != null ? (string)r.Element("Email") : "",
    FamilyStatus = (string)r.Element("Familystatus") != null ? (string)r.Element("Familystatus") : "",
    ID = (int)r.Element("IdNumber") != 0 ? (int)r.Element("IdNumber") : 0,
    Phone1 = (int)r.Element("Telephone1") != 0 ? (int)r.Element("Telephone1") : 0,
    Phone2 = (int)r.Element("Telephone2") != 0 ? (int)r.Element("Telephone2") : 0,
    phone3 = (int)r.Element("Telephone3") != 0 ? (int)r.Element("Telephone3") : 0
  };
  return member.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>

在这一行from r in doc.Decendants("")... 中,我尝试了各种变化。感谢所有人

4

1 回答 1

4

问题是命名空间:

<UpdateMember xmlns="http://tempuri.org/">

这意味着默认情况下,您的所有元素都在该名称空间中。您的查询都尝试查找不在命名空间中的元素,例如

Element("Familystatus")

这在 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("Telephone1") != 0 ? (int)r.Element("Telephone1") : 0

应该:

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无论如何都超出了范围。我会将它们保留为字符串。

于 2012-12-06T14:25:57.357 回答