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")

これは、LINQtoXMLで非常に簡単に修正できます。

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?と、代わりにnull値が返されます。

コード全体を次のように変更します。

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 に答える