2012-09-11 102 views
2

考慮這個HTML:GET節點在LINQ to XML屬性

<table> 
    <tr> 
    <td width="45%" align="right"> 
     <h2>1.00 NZD</h2> 
    </td> 
    <td valign="top" align="center"> 
     <h2>=</h2> 
    </td> 
    <td width="45%" align="left"> 
     <h2>0.415528 GBP</h2> 
    </td> 
    </tr> 
</table> 

我用這個代碼字符串,並將其轉換爲XML文件:

string raw = "<table><tr><td width=\"45%\" align=\"right\"><h2>1.00 NZD</h2></td><td valign=\"top\" align=\"center\"><h2>=</h2></td><td width=\"45%\" align=\"left\"> <h2>0.415528 GBP</h2> </td></tr></table>"; 

XElement info = XElement.Parse(raw); 

現在我想All td that have align="right"寫這段代碼:

var elementToChange = (from c in info.Elements("td") 
          where c.Attribute("align").Value == "right" 
          select c); 


Label1.Text = Server.HtmlEncode(elementToChange.First().ToString()); 

,但我得到這個錯誤:

Sequence contains no elements

問題在哪裏?

感謝

回答

3

你找"td"元素,但在節點的頂層,你只能找"tr"元素。這就是爲什麼你沒有得到任何元素。試試這個:

from c in info.Elements("tr").Elements("td") 

此外,你應該檢查是否有序列中的任何元素調用First()之前(或使用FirstOrDefault()如果沒有元件,它返回null)。

如果你不知道路徑,只希望所有"td"元素與標籤值,您還可以使用Descendants擴展方法:

from c in info.Descendants("td") 
+0

感謝它的工作。但考慮我們不知道的路徑。有任何方式存在,返回任何路徑中的所有節點thta具有特定值的特定屬性? – Arian

+0

@Kerezo是的,「後代」方法可以做到這一點。看我的編輯。 – Botz3000

0

Elements會給你直接子元素的在這種情況下的根信息。您需要深入查找您正在查找的元素,然後通過Where子句提取它們。在你的情況下,直系子女是<tr>