2011-12-20 14 views
1

私は、次のXMLファイルを持っている:私は顧客の所在地に基づいて男性の値を取得するためのXML INORDERにLINQを使用してクエリを実行しようとしていますlinqをxmlに使用してXMLファイルをクエリしますか?

<?xml version="1.0" encoding="utf-8"?> 
<Cus> 
    <Customer Location="NJ"> 
    <Male Value="True" /> 
    <Name Value="xxx" /> 
    </Customer> 
    <Customer Location="NY"> 
    <Male Value="True" /> 
    <Name Value="yyy" /> 
    </Customer> 
</Cus> 

を。ここで

はクエリです:

var Male = from e in doc.Descendants("Male") 
      select new 
      { 
       Male = e.Attribute("Value").Value.ToString() 
      }; 

私は男性の値を取得することができるが、私は追加するには、XML file.Howに顧客の所在地に基づいて名前を取得する方法が混乱していますここでどこの条件が顧客の位置を決定するか。私はいくつかの人が私を導くことができれば感謝します。

答えて

0

位置に基づいて名前の値を選択するために、あなたのようなものを使用することができますXMLに指定された要素または属性が含まれていない場合は、null値への実行を心配することなくXMLを照会します。 Location属性や男性の要素は、あなたが終了存在しない何らかの理由場合

 var customers = xdoc.Descendants("Customer") 
         .Where(x => x.SafeAttribute("Location").Value == "NJ") 
         .Select(x => x.SafeElement("Male").SafeAttribute("Value").Value); 

これらの拡張メソッドのコードはここにある:

public static XElement SafeElement(this XContainer container, string name) 
    { 
     return container.Element(name) ?? new XElement(name); 
    } 

    public static XAttribute SafeAttribute(this XElement element, string name) 
    { 
     return element.Attribute(name) ?? new XAttribute(name, ""); 
    } 

あなたはこのようにそれを使用します例外の代わりに空の結果セットを使用します。

0

男性を取得する前にCustomer要素でwhere句を実行する必要があります。したがって、このような何か:

var males = from customer in doc.Descendants("Customer") 
      where "NY".Equals(customer.Attribute("Location").Value) 
      select customer.Descendants("Male"); 

注:これはテストされていないが、それはあなたの進め方の何らかの指示を与える必要があります。詳細についてはwhereキーワードのMSDN articleをご確認ください。

また、役立つ場合は、列挙可能なコレクションには常にLINQ Extensionsを使用することをおすすめします。私はそれらが節のキーワードよりもはるかに容易に読み書きすることがわかります。彼らは聞かせて、このような何か私は実際にXMLの拡張メソッドSafeElementとSafeAttribute等の

private string CountOfMales(XDocument doc, string locationToFilter) 
{ 
    var selection = from customer in doc.Descendants("Customer") 
       .Where(c => c.Attribute("Location").Value == locationToFilter) 
       select new 
       { 
        MaleValue = customer.Element("Name").Attribute("Value").Value 
       }; 

       return selection.FirstOrDefault().MaleValue; 
} 
0

: - あなたの質問パー

関連する問題