14
<Employees>
  <Employee>
    <EmpId>1</EmpId>
    <Name>Sam</Name>
    <Sex>Male</Sex>
    <Phone Type="Home">423-555-0124</Phone>
    <Phone Type="Work">424-555-0545</Phone>
  </Employee>
</Employees>

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    emplyeeDetails = XDocument.Load(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\LinqToXml\\Xmls\\" + "Employees.xml");
    var emplyees = from emp in emplyeeDetails.Descendants("Employee").Take(10)
                   orderby emp.Element("EmpId").Value ascending
                   select new
                   {
                       Id = emp.Element("EmpId").Value,
                       Name = emp.Element("Name").Value,
                       Sex = emp.Element("Sex").Value,
                       WorkPhone=emp.Element("Phone").Attribute("Type").Value,
                       HomePhone = emp.Element("Phone").Attribute("Type").Value,                               
                   };
    DgrdEmployeeDetails.ItemsSource = emplyees.ToList();
}

上記のコードを使用すると、以下の結果が得られます。 ここに画像の説明を入力

しかし、代わりに列WorkPhoneの値が必要であり、424-555-0545代わりにHomeHomePhoneの値が必要423-555-0124ですHome

そのためにはどうすればよいですか?

4

2 に答える 2

15

Where次の方法を使用します。

自宅の電話番号の場合:

emp.Elements("Phone").Single(phoneElement => phoneElement.Attribute("Type").Value == "Home").Value

勤務先電話番号の場合:

emp.Elements("Phone").Single(phoneElement => phoneElement.Attribute("Type").Value == "Work").Value
  • emp.Elements("Phone")のすべての「電話」要素で列挙可能ですemp
  • Single指定されたプロパティを満たす要素を取得します (プロパティを満たす要素が 0 個または複数ある場合は、エラーが発生します)。
  • phoneElement.Attribute("Type").Value属性「タイプ」の値 (つまり、「自宅」または「職場」)

次に、コードは次のようになります。

var emplyees = from emp in emplyeeDetails.Descendants("Employee").Take(10)
                orderby emp.Element("EmpId").Value ascending
                select new
                {
                    Id = emp.Element("EmpId").Value,
                    Name = emp.Element("Name").Value,
                    Sex = emp.Element("Sex").Value,
                    WorkPhone = emp.Elements("Phone").Single(phoneElement => phoneElement.Attribute("Type").Value == "Home").Value,
                    HomePhone = emp.Elements("Phone").Single(phoneElement => phoneElement.Attribute("Type").Value == "Work").Value,
                };

要素に職場の電話番号または自宅empの電話番号がない可能性がある場合、上記のコードは で例外を発生させます。このケースに対処するには、コードを次のように変更する必要があります。Single

(string)emp.Elements("Phone").SingleOrDefault(phoneElement => phoneElement.Attribute("Type").Value == "Home")

SingleOrDefaultnull条件を満たす "Phone" 要素がなく、stringa のキャストが と等しい場合、XElementは等しくなりXElement.Valueます。

于 2013-01-26T18:07:30.247 に答える
3

Phoneこのコードは、employee の要素が存在する場合でも機能します。

var emplyees = 
    from emp in emplyeeDetails.Descendants("Employee").Take(10)
    let phones = emp.Descendants("Phone")
    orderby (int)emp.Element("EmpId")
    select new
    {
        Id = (int)emp.Element("EmpId"),
        Name = (string)emp.Element("Name"),
        Sex = (string)emp.Element("Sex"),
        WorkPhone = (string)phones.FirstOrDefault(p => (string)p.Attribute("Type") == "Work"),
        HomePhone = (string)phones.FirstOrDefault(p => (string)p.Attribute("Type") == "Home")                               
    };

プロパティにアクセスする代わりにstring、 、 などにキャスト要素を使用します。なんで?XMLに欠落している要素または属性がある場合、. ただし、キャストは代わりにデフォルト値を返します。したがって、上記のコードは次のような xml も解析します。intValueNullReferenceException

<Employees>
  <Employee>
    <EmpId>1</EmpId>
    <Name>Sam</Name>
    <Phone Type="Home">423-555-0124</Phone>
    <Phone>524-777-1234</Phone>
  </Employee>
</Employees>
于 2013-01-26T18:14:14.910 に答える