通过它在linq中的属性获取Node到xml

时间:2012-09-11 06:32:13

标签: c# asp.net linq c#-4.0 linq-to-xml

考虑这个HTML:

<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());

但是我得到了这个错误:

  

序列不包含元素

哪里有问题?

感谢

2 个答案:

答案 0 :(得分:3)

您查找"td"元素,但在节点的顶层只能找到"tr"元素。这就是为什么你没有得到任何元素。试试这个:

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

此外,您应该在调用First()之前检查序列中是否有任何元素(或使用FirstOrDefault()如果没有元素则返回null。)

如果您不知道路径并且只想要具有该标记值的所有"td"元素,您还可以使用Descendants扩展方法:

from c in info.Descendants("td")

答案 1 :(得分:0)

Elements会在这种情况下为您提供root的直接子元素。您需要深入查看要查找的元素,然后通过Where子句提取它们。在您的情况下,直接的孩子是<tr>