65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP 解析器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.90/5 (31投票s)

2004年4月29日

CPOL

3分钟阅读

viewsIcon

117484

downloadIcon

1880

本文介绍了一种解析和分析 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。有几种类型的标签:RootOpenCloseTextDirectiveCodeCommentASP.Tag 的类型可以通过 Tag.TagType 属性进行检查。

  1. Root 标签 - 唯一具有 Root 类型的标签是 ASP.Document。此标签类型不包含属性。
  2. Open 标签 - 例如:<title>。此标签类型可以包含属性。
  3. Close 标签 - 例如:</title>。此标签类型不包含属性。
  4. Text 标签 - 出现在其他标签之间的任何文本,例如:(<title>TEXT</title>TEXT 将作为 Text 标签出现在 ASP.Document 树中)。此标签类型不包含属性。
  5. Directive 标签 - 以 %@ 开头的任何标签,例如:<%@ Page language= "c#" ... %>。此标签类型可以包含属性。
  6. Code标签 - 以 % 开头和结尾的任何标签(不包括以 %@ 开头的 Directive,以及以 %-- 开头的 Comment),例如:<% this.DoSomething() %>。此标签类型不包含属性。
  7. Comment 标签 - XML 注释,例如:<!-- COMMENTED -->,或服务器端注释,例如:<%-- COMMENTED --%>。此标签类型不包含属性。

属性

每个 ASP.Tag 对象都有 Tag.Attributes 属性,其中包含标签属性的列表。如果标签不包含属性或其类型不支持属性,则列表为空。因此,只有 OpenDirective标签可以包含非空属性列表。

每个属性都包含键 (Attribute.Key) 和值 (Attribute.Value)。如果属性不包含值,则值可以为空字符串 ("")。

限制

我在所示 ASP DOM 中发现的主要限制是它只允许只读访问已解析的 ASPX / ASCX 文档。它不允许修改 ASP.Document 结构并将其保存回字符串。

摘要

本文档并未描述所提供的 ASP DOM 的所有功能,只是简要展示了如何使用它。我相信在大多数开发场景中,ASP DOM 并不是必需的,但我希望分享我获得的经验,让您的生活更轻松。对于将要使用它的人:请尽情使用吧。

本文附带的源代码包含一个示例应用程序,该应用程序将解析的 ASPX 文档显示为树状结构。

© . All rights reserved.