2012-05-07 4 views
0

未知の深さと、XMLで子ノードの値を取得します。私はこのようなXMLを取得

<menu> 
    <is> 
    <not> 
     <l>Title</l> 
     <s>url1</s> 
     <t>1</t> 
     <is> 
     <hlua> 
      <l>Title</l> 
      <s>url2</s> 
      <t>0</t> 
      <is> 
       <frme> 
       <l>Title</l> 
       <s>url3</s> 
       <t>1</t> 
       </frme> 
      </is> 
     </hlua> 
     <chrj> 
      <l>Title</l> 
      <s>url4</s> 
      <t>1</t> 
      <is> 
       <cgas> 
       <l>Title</l> 
       <s>url5</s> 
       <t>1</t> 
       <is> 
        <el12> 
        <l>Title</l> 
        <s>url6</s> 
        <t>1</t> 
        </el12> 
       </is> 
       </cgas> 
       <cael> 
       <l>Title</l> 
       <s>url7</s> 
       <t>0</t> 
       </cael> 
      </is> 
     </chrj> 
     </is> 
    </not> 
    </is> 
<menu> 

私は、ノードの名前だけを子ノードの名前を知らない「メニュー」 。 私は値ノードのリストを取得したいウォールド:「s」はそのノード「T」= 1であれば、彼の親ノード「T」の場合= 1

私はこのリストを取得したいと思います:

    XMLの例では
  • url5
  • url6

  • URL1
  • url4
  • 私はURLを取得しない "URL2" BECAノード "t" = 0 ノード "t" = 1であるにもかかわらず、親ノード "hlua"のノード "t" = 0

    どうすればよいのでしょうか? LINQでこれを行いますか?

    ありがとうございます!

    私はこれは私の質問を解決思う:

    List<XElement> listurls = (from elements in xe.Descendants() 
        //Elemento 
        let t_element = elements.Element("t") 
        let t_element_value = t_element != null ? t_element.Value : String.Empty 
    
        //Elemento Padre 
        let parent_element = elements.Parent.Parent 
        let t_element_parent = parent_element.Element("t") 
        let t_element_parent_value = t_element_parent != null ? t_element_parent.Value : "1" 
    
        where t_element_value.EndsWith("1") && t_element_parent_value.EndsWith("1") && elements.Element("u").Value!="#" && elements.Element("u").Value != "" 
        select elements.Element("u")).ToList(); 
    
    +0

    は依然として問題ですか、解決策を見つけましたか? –

    答えて

    0

    私はなぜ期待される結果にあなたがURL1を見ることを期待はかなりわからない - 値「1に等しい子トン要素を持っている何の祖先要素がありません"とにかく私はあなたを見てみたいことがあり、次のクエリを思い付く:

    それは、その結果
    var xDoc = XDocument.Parse(
    @"<menu> 
        <is> 
        <not> 
         <l>Title</l> 
         <s>url1</s> 
         <t>1</t> 
         <is> 
         <hlua> 
          <l>Title</l> 
          <s>url2</s> 
          <t>0</t> 
          <is> 
           <frme> 
           <l>Title</l> 
           <s>url3</s> 
           <t>1</t> 
           </frme> 
          </is> 
         </hlua> 
         <chrj> 
          <l>Title</l> 
          <s>url4</s> 
          <t>1</t> 
          <is> 
           <cgas> 
           <l>Title</l> 
           <s>url5</s> 
           <t>1</t> 
           <is> 
            <el12> 
            <l>Title</l> 
            <s>url6</s> 
            <t>1</t> 
            </el12> 
           </is> 
           </cgas> 
           <cael> 
           <l>Title</l> 
           <s>url7</s> 
           <t>0</t> 
           </cael> 
          </is> 
         </chrj> 
         </is> 
        </not> 
        </is> 
    </menu>"); 
    
    var urls = from url in xDoc.Descendants("s") 
          let ancestorWithTChildElement = url.Parent.Ancestors().FirstOrDefault(e => e.Elements("t").Any()) 
          where (string)url.Parent.Element("t") == "1" 
          && ancestorWithTChildElement != null && (string)ancestorWithTChildElement.Element("t") == "1" 
          select url; 
    
    foreach (var urlElement in urls) 
    { 
        Console.WriteLine((string)urlElement); 
    } 
    

    :子要素であり何の祖先要素が存在しないと見つからない

     
    url4 
    url5 
    url6 
    Press any key to continue . . . 
    

    (URL1すべて

    0

    で、私はそれを得る! ソリューション:

    List<string> listurls = (from a in xe.Descendants("s") 
        let ancestros = a.Ancestors().Elements("t").FirstOrDefault(e => e.Value.EndsWith("0")) 
        where ancestros == null 
        select a.Value).ToList(); 
    

    = D

    +0

    これが答えであれば、他のSOユーザーが簡単に見つけることができるように、それを受け入れられたものとしてマークすることを検討する必要があります。あなたの質問履歴を見ても、回答はまだ受け付けていないので、最新の回答を見直してあなたの質問にまだ回答しているかどうかを確認し、それを受け入れたものとしてマークする価値があります。 – RyanfaeScotland

    関連する問題