【问题标题】:Traversing ASP.NET HTML Elements using LINQ使用 LINQ 遍历 ASP.NET HTML 元素
【发布时间】:2010-07-16 16:57:07
【问题描述】:

假设我有以下 ASP.NET HTML 代码:

<html>
    <head><title>Test Page</title></head>
    <body id="bodyID">
        <asp:Label runat="server" id="lbl1" text="First Name:" />
        <asp:TextBox runat="server" id="txt1" /><br />
        <asp:Label runat="server" id="lbl2" text="Last Name:" />
        <asp:TextBox runat="server" id="txt2"></asp:TextBox>
    </body>
</html>

我正在尝试编写一个 linq 查询,该查询将从任何 asp 标记中检索所有 ID。此外,查询需要按字母顺序将所有内容组合在一起。所以对于上面的例子,linq 查询应该返回“lbl1”,然后是“lbl2”,然后是“txt1”,最后是“txt2”。请注意,它没有获取“bodyID”,因为它不是 ASP.NET 标记的一部分。是否有捷径可寻?顺便说一句,我正在使用 C#。

【问题讨论】:

  • 听起来是个奇怪的要求,我知道。我工作的公司要求记录所有服务器标签 ID。我想如果我可以编写一个程序来提取所有这些 id 并将它们放在一起,这将节省我很多时间。

标签: c# .net asp.net linq linq-to-entities


【解决方案1】:

如果您想使用 Linq To XML,则必须解决 &lt;asp:&gt; 标记,并且它们不能完全加载到 XML 中。

此代码将为您提供所需的内容,假设:

  • 您可以将 ASPX 标记加载到字符串中
  • ASPX 标记是有效的 XML。

如果您有任何不在标记中的有效asp: 内容,则将asp: 替换为asp- 可能会导致问题。这可以清理以使其适合您的需求。

  public static void Main(string[] args)
    {
        string aspxCode = @"<html><head><title>Test Page</title></head>
                            <body id=""bodyID"">        
        <asp:Label runat=""server"" id=""lbl1"" text=""First Name:"" />
        <asp:TextBox runat=""server"" id=""txt1"" /><br />
        <asp:Label runat=""server"" id=""lbl2"" text=""Last Name:"" />
        <asp:TextBox runat=""server"" id=""txt2""></asp:TextBox>
    </body>
</html>";

        XElement xDoc = XElement.Parse(aspxCode.Replace("asp:", "asp-"));

        var allMatchingASPtags = xDoc.Descendants()
               .Where(d => d.Name.LocalName.StartsWith("asp-"))
               .Select(c => c.Attribute("id").Value);

        foreach (var t in allMatchingASPtags)
        {
            Console.WriteLine(t);
        }

        Console.ReadLine();

【讨论】:

  • 前几天我偶然发现了 Linq to XML,它帮了我很大的忙!
  • 很好的解决方案,但我会警惕 ASP 页面声明,例如 和 等等...
【解决方案2】:

最简单的方法是编写一个正则表达式来提取所有 id,然后对列表进行排序。因为每个元素都以&lt;asp: 开头,所以应该很容易做到。如果我有更多时间,我会计算出正则表达式。

【讨论】:

    【解决方案3】:

    你也许可以解析它。

    创建临时文件,为您要使用的任何类型的解析器添加标题。

    将 html/asp 代码添加到临时文件并关闭它。

    使用您喜欢的解析库解析文件。

    循环浏览 ASP 节点,将它们添加到列表中。

    对列表进行排序。

    您也可以使用正则表达式来做到这一点。

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多