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 文档显示为树状结构。