2

解決策は簡単だと思いますが、インターネットを広範囲に検索しても答えが見つかりません。助けてください!問題は、必要な属性が同様の名前の要素の最初の要素内にない場合、xml クエリが必要な結果を返さないことです。たとえば、次のコードは何も返しません。

XElement xelement = XElement.Load("~/Employees.xml"));
        var homePhone = from phoneno in xelement.Elements("Employee")
               where (string)phoneno.Element("Phone").Attribute("Type") == "Work"
        select phoneno;
foreach (XElement xEle in homePhone)
        TextBox1.Text= xEle + "/n";

ただし、「Work」を「Home」に置き換えると、必要な結果が得られます。実際、「Work」でもまったく同じ結果が得られるはずです。誰かがこれを行う方法を説明できますか?

xml テンプレートは次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<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>
    <Address>
      <Street>7A Cox Street</Street>
      <City>Acampo</City>
      <State>CA</State>
      <Zip>95220</Zip>
      <Country>USA</Country>
    </Address>
  </Employee>
  <Employee>
    <EmpId>2</EmpId>
    <Name>Lucy</Name>
    <Sex>Female</Sex>
    <Phone Type="Other">143-555-0763</Phone>
    <Phone Type="Work">434-555-0567</Phone>
    <Address>
      <Street>Jess Bay</Street>
      <City>Alta</City>
      <State>CA</State>
      <Zip>95701</Zip>
      <Country>USA</Country>
    </Address>
  </Employee>
  <Employee>
    <EmpId>3</EmpId>
    <Name>Kate</Name>
    <Sex>Female</Sex>
    <Phone Type="Home">166-555-0231</Phone>
    <Phone Type="Other">233-555-0442</Phone>
    <Address>
      <Street>23 Boxen Street</Street>
      <City>Milford</City>
      <State>CA</State>
      <Zip>96121</Zip>
      <Country>USA</Country>
    </Address>
  </Employee>
  <Employee>
    <EmpId>4</EmpId>
    <Name>Chris</Name>
    <Sex>Male</Sex>
    <Phone Type="Work">564-555-0122</Phone>
    <Phone Type="Other">442-555-0154</Phone>
    <Address>
      <Street>124 Kutbay</Street>
      <City>Montara</City>
      <State>CA</State>
      <Zip>94037</Zip>
      <Country>USA</Country>
    </Address>
  </Employee>
</Employees>
4

2 に答える 2

0

この行:

where (string)phoneno.Element("Phone")

要求したのは 1 つだけなので、実際には最初の Phone 要素のみを使用しています。メソッドを使用する必要がありElementsますが、従業員の代わりにすべての電話を反復できます。

from phone in xelement.Descendants("Phone")
where (string)phone.Attribute("Type") == "Work"
select phone;

この電話機が従業員のものであることを確認するには、次の条件を に追加しますwhere

phone.Parent.Name == "Employee"
于 2012-11-01T14:34:19.677 に答える
0

XElement.Element("name") は、複数の名前がある場合、指定された名前の最初の要素を返します。あなたは本当にこれが欲しい:

var employeesWithHomePhone = from e in xdocument.Root.Elements("Employee")
                             where e.Elements("Phone").Any( p => (string)p.Attribute("Type") == "Home") 
                             select e;

そして、「自宅」を「職場」に変更するだけで、職場番号のものを取得できます

于 2012-11-01T14:34:33.067 に答える