ASP 解析器






3.90/5 (31投票s)
本文介绍了一种解析和分析 ASP 文档结构的方法。
引言
在我使用 ASP+ 的过程中,我开发了一些设计时工具。我早就遇到了一个问题,那就是无法分析 ASPX 或 ASCX 文档结构。微软不支持类似 XML DOM 的 ASP 文档对象模型。因此,我不得不创建自己的 ASP 解析器,它分析 ASPX / ASCX 文档标签并创建一个对象树来表示文档的结构。ASP DOM 在我的自动本地化机制中非常有用,但它也可以用于许多其他情况。
示例
创建新的 ASPX 文档时,它通常看起来像这样
<%@ Page language="c#" Codebehind="Empty.aspx.cs" 
   AutoEventWireup="false" Inherits="PersistingObjects.Empty" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 
<html>
  <head>
    <title>Empty</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name=vs_defaultClientScript content="JavaScript">
    <meta name=vs_targetSchema 
      content="http://schemas.microsoft.com/intellisense/ie5">
  </head>
  <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">
    </form>
  </body>
</html>
使用本文介绍的 ASP DOM 解析文档后,可以将其显示为对象树,例如

您可以在此处找到 ASPX 文档中出现的标签的解析树。每个标签(包括 
)都由一个树节点表示,该节点包含属性和子标签的集合。
详细说明
要创建 ASP 文档,请使用以下代码
string asp = 
  "<asp:linkbutton id=\"LinkButton1\" runat="\""server\">text</asp:linkbutton>";
ASP.Document root = new ASP.Document(asp);
创建 ASP.Document 后,可以递归地遍历它,例如
public void Traverse(ASP.Tag tag)
{
    foreach(ASP.Tag child in tag.ChildTags)
    {
        Console.WriteLine(child.Value);
        foreach(ASP.Attribute attribute in child.Attributes)
        {
            Console.WriteLine(attribute.Key + "=" + attribute.Value);
        }
        Traverse(tag);
    }
}
由于 ASP.Document 继承自 ASP.Tag,因此可以像这样调用 Traverse 方法
Traverse(root)
标签
解析后的 ASPX/ASCX 的核心对象是 ASP.Tag。有几种类型的标签:Root、Open、Close、Text、Directive、Code和 Comment。ASP.Tag 的类型可以通过 Tag.TagType 属性进行检查。
- Root标签 - 唯一具有 Root 类型的标签是- ASP.Document。此标签类型不包含属性。
- Open标签 - 例如:- <title>。此标签类型可以包含属性。
- Close标签 - 例如:- </title>。此标签类型不包含属性。
- Text标签 - 出现在其他标签之间的任何文本,例如:(- <title>TEXT</title>,- TEXT将作为- Text标签出现在- ASP.Document树中)。此标签类型不包含属性。
- Directive标签 - 以- %@开头的任何标签,例如:- <%@ Page language= "c#" ... %>。此标签类型可以包含属性。
- Code- 标签 - 以- %开头和结尾的任何标签(不包括以- %@开头的- Directive,以及以- %--开头的- Comment),例如:- <% this.DoSomething() %>。此标签类型不包含属性。
- Comment标签 - XML 注释,例如:- <!-- COMMENTED -->,或服务器端注释,例如:- <%-- COMMENTED --%>。此标签类型不包含属性。
属性
每个 ASP.Tag 对象都有 Tag.Attributes 属性,其中包含标签属性的列表。如果标签不包含属性或其类型不支持属性,则列表为空。因此,只有 Open 或 Directive标签可以包含非空属性列表。
每个属性都包含键 (Attribute.Key) 和值 (Attribute.Value)。如果属性不包含值,则值可以为空字符串 ("")。
限制
我在所示 ASP DOM 中发现的主要限制是它只允许只读访问已解析的 ASPX / ASCX 文档。它不允许修改 ASP.Document 结构并将其保存回字符串。
摘要
本文档并未描述所提供的 ASP DOM 的所有功能,只是简要展示了如何使用它。我相信在大多数开发场景中,ASP DOM 并不是必需的,但我希望分享我获得的经验,让您的生活更轻松。对于将要使用它的人:请尽情使用吧。
本文附带的源代码包含一个示例应用程序,该应用程序将解析的 ASPX 文档显示为树状结构。


