2012-05-07 47 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

我想獲得這個名單:

  • 爲url1
  • URL4
  • URL5
  • url6

在XML實例 我不明白的URL 「URL2」 貝科使用他的節點「t」= 0 我沒有得到url「url3」,因爲雖然他的節點「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 - 有是有一個孩子T形元件,其值等於「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