【问题标题】:get Node by it's attribute in linq to xml通过它在 linq to xml 中的属性获取节点
【发布时间】:2012-09-04 01:03:14
【问题描述】:

考虑一下这个 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());

但我收到此错误:

序列不包含任何元素

问题出在哪里?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

    如果你不知道路径,只想要所有带有该标签值的"td"元素,你也可以使用Descendants扩展方法:

    from c in info.Descendants("td")
    

    【讨论】:

    • 感谢它的工作原理。但考虑到我们不知道路径。是否存在任何方法可以返回任何路径中的所有节点,该节点具有具有特定值的特定属性?
    • @Kerezo 是的,Descendants 方法可以做到这一点。查看我的编辑。
    【解决方案2】:

    Elements 将在这种情况下为您提供根的 直接子元素 信息。您需要深入到您要查找的元素,然后通过Where 子句提取它们。在您的情况下,直系子女是&lt;tr&gt;s。

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多