2010-07-16 121 views
0

假设我有以下ASP.NET HTML代码:遍历ASP.NET HTML元素使用LINQ

<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查询,将检索所有的ID从任何ASP标签。此外,查询需要按字母顺序将所有内容组合在一起。因此,对于上面的示例,linq查询应该返回“lbl1”,接着是“lbl2”,接着是“txt1”,最后是“txt2”。注意它没有抓住“bodyID”,因为它不是ASP.NET标签的一部分。是否有捷径可寻?顺便说一句,我正在使用C#。

+0

一个问题为什么? – msarchet 2010-07-16 18:26:56

+0

听起来像一个奇怪的请求,我知道。我所在的公司要求记录所有服务器标签ID。我想如果我能编写一个程序来提取所有这些ID并将它们放在一起,这将为我节省很多时间。 – Icemanind 2010-07-16 19:37:09

回答

1

如果您想要使用Linq To XML,则必须解决<asp:>标记,并且它们不会干净地加载到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(); 
+0

有一天我偶然发现了Linq to XML,它的帮助非常大! – 2010-07-16 19:07:14

+0

好的解决方案,但我会对ASP页面声明的警惕,例如<% ... %>和<%: %>等... – 2010-07-19 08:00:08

0

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

0

您可能可以解析它。

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

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

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

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

对列表排序。

你也可以用正则表达式来做。