2011-06-21 18 views
0

私は次のようなXMLを持っています。Linq to XML(あるノードの下で特定の値を取得)

<testing> 
    <node01 name="node01Name"> 
    <node02s> 
     <node02 name="1"> 
     <CustomProperties> 
      <CustomProperty Name="ASCII File Name" Value="index.txt" FilterID="0" /> 
      <CustomProperty Name="ASCII Folder" Value="\\abc\cdf\aaaa" FilterID="0" /> 
      <CustomProperty Name="Delimiter" Value="CommaQuote" FilterID="0" /> 
      <CustomProperty Name="Duplicate Handling" Value="Replace if Dup" FilterID="0" /> 
      <CustomProperty Name="EMAILATTDOC" Value="1" FilterID="0" /> 
      <CustomProperty Name="EMAILATTINDEX" Value="0" FilterID="0" /> 
      <CustomProperty Name="EMAILOUTBODY" FilterID="0" /> 
      <CustomProperty Name="EMAILOUTCC" FilterID="0" /> 
     </CustomProperties> 
     </node02> 
     <node02 name="2"> 
     <CustomProperties> 
      <CustomProperty Name="ASCII File Name" Value="index.txt" FilterID="0" /> 
      <CustomProperty Name="ASCII Folder" Value="\\abc\cdf\aaaa" FilterID="0" /> 
      <CustomProperty Name="Delimiter" Value="CommaQuote" FilterID="0" /> 
      <CustomProperty Name="Duplicate Handling" Value="Replace if Dup" FilterID="0" /> 
      <CustomProperty Name="EMAILATTDOC" Value="1" FilterID="0" /> 
      <CustomProperty Name="EMAILATTINDEX" Value="0" FilterID="0" /> 
      <CustomProperty Name="EMAILOUTBODY" FilterID="0" /> 
      <CustomProperty Name="EMAILOUTCC" FilterID="0" /> 
     </CustomProperties> 
     </node02> 
    </node02s>  
    </node01> 
</testing> 

私は、各node02で下の各CustomPropertyを取得する必要があります。これは私のコードです。

XDocument configparentXML = XDocument.Load("admin.xml"); 
string node = "node02"; 

var batchClasses = from batchClasse in configparentXML.Descendants(node) 
        select new ReadingXmlWithLinq 
        { 
         BatchClassName = batchClasse.Attribute("Name") != null ? batchClasse.Attribute("Name").Value : "", 
        }; 

foreach (var lv0 in batchClasses) 
{ 
    node = "CustomProperty"; 
    var CustomProperties = from CustomProperty in configparentXML.Descendants(node)          
          select new ReadingXmlWithLinq 
          { 
           CustomPropertyName = documentClasse.Attribute("Name") != null ? documentClasse.Attribute("Name").Value : "" 
          }; 
} 

しかし、そのリターンを聞くすべてのCustomPropery値インチnode02に対してCustomerProperyを取得するにはどうすればよいですか?

ありがとうございました。

+1

私はurのコメントを受け入れます。私が投票で受け入れたいくつかの回答。しかし、私は正しいマークを舐めることでそれを確認していません。申し訳ありません。そしてコメントのためのthax。それは決して再び起こりません。 – Charitha

+0

良いもの。私の答えを見てください。 – spender

答えて

3

私は、XPathと、このアプローチしたい:次のようにパスを変更することができ<node02 name="2">(例えば)の下で、すべてのノードを取得するには

var xmlString = @"<testing>...</testing>"; 
var doc = XDocument.Parse(xmlString); 
var nav = doc.CreateNavigator(); 
var path = "/testing/node01/node02s/node02/CustomProperties/CustomProperty"; 
var nodeIterator = nav.Select(path); 
var nodes = 
    nodeIterator 
     .Cast<XPathNavigator>() 
     .Select(n=>XElement.Parse(n.OuterXml)); 

EDIT

var path= 
    "/testing/node01/node02s/node02[@name=2]/CustomProperties/CustomProperty"; 

を可能なことを確認できるように、page of XPath examplesがあります。

+0

返信用のThanx。しかし、私はまだCustomProperiesを個別に手に入れることはできません。私は、Node02の名前1の下でCustomPropertiesを取得し、Node02の名前2のCustomPropertiesを別々に取得する必要があります。 – Charitha

+0

XPathはこれをサポートしています。私の編集を参照してください。 – spender

+0

はい。今働いている。これは私が探していたものです。どうもありがとう。 – Charitha

1

データをどのようにしたいのかは分かりませんが、ここでは十分な情報がありません。

代わりに、すべてのnode02要素を選択し、その名前とCustomPropertyの名前を取得する方法の例を次に示します。あなたのコードと同じようにALLnode02ALLCustomPropertyを選択します。あなたは実際に何もフィルタリングしておらず、ノードまたはプロパティを指定しませんでした。あなたが本当に欲しいものを混乱させます。代わりに、ここにあなたがしたいと思うことをする方法を示す例があります:

XDocument doc = ...; 
var batchClasses = doc.Descendants("node02") 
    .Select(n => new 
    { 
     BatchClassName = (string)n.Attribute("name") ?? "", 
     CustomPropertyNames = n.Descendants("CustomProperty") 
      .Select(cp => (string)cp.Attribute("Name") ?? "") 
      .ToList(), 
     // Here's an example to select "EMAIL" custom property names 
     EmailPropertyNames = n.Descendants("CustomProperty") 
      .Select(cp => (string)cp.Attribute("Name") ?? "") // select the names... 
      .Where(s => s.StartsWith("EMAIL"))    // that start with "EMAIL" 
      .ToList(),     
    }); 
関連する問題