2012-09-11 52 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>