gpt4 book ai didi

c# - 解析aspx文件中的控件并将其转换为xml

转载 作者:数据小太阳 更新时间:2023-10-29 02:50:40 25 4
gpt4 key购买 nike

我需要解析 aspx 文件(来自磁盘,而不是在浏览器上呈现的文件)并列出页面上存在的所有服务器端 asp.net 控件,然后从中创建一个 xml 文件.这是最好的方法吗?另外,是否有任何可用的库?

例如,如果我的 aspx 文件包含

<asp:label ID="lbl1" runat="server" Text="Hi"></asp:label>

我的 xml 文件是

<controls><br/>
<ID>lbl1</ID><br/>
<runat>server</runat><br/>
<Text>Hi</Text><br/>
</controls>

最佳答案

Xml 解析器无法理解 ASP 指令:<%@ <%= etc.

您可能最好使用正则表达式来执行此操作,可能分 3 个阶段。

  1. 匹配整个页面中的任何标记元素。
  2. 对于每个标签,匹配标签和控件类型。
  3. 对于匹配 (2) 的每个标签,匹配任何属性。

因此,从顶部开始,我们可以使用以下正则表达式:

(?<tag><[^%/](?:.*?)>)

这将匹配任何没有 <% 和

<asp:Content ID="ph_PageContent" ContentPlaceHolderID="ph_MainContent" runat="server">
<asp:Image runat="server" />
<img src="/test.png" />

对于每个捕获的标签,我们希望提取标签并输入:

<(?<tag>[a-z][a-z1-9]*):(?<type>[a-z][a-z1-9]*)

创建命名的捕获组使这更容易,这将使我们能够轻松提取标签和类型。这将只匹配服务器标签,因此此时将删除标准 html 标签。

<asp:Content ID="ph_PageContent" ContentPlaceHolderID="ph_MainContent" runat="server">

将产生:

{ tag = "asp", type = "Content" }

使用相同的标签,我们可以匹配任何属性:

(?<name>\S+)=["']?(?<value>(?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?

产生:

{ name = "ID", value = "ph_PageContent" },
{ name = "ContentPlaceHolderID", value = "ph_MainContent" },
{ name = "runat", value = "server" }

因此将所有这些放在一起,我们可以创建一个可以为我们创建 XmlDocument 的快速函数:

public XmlDocument CreateDocumentFromMarkup(string content)
{
if (string.IsNullOrEmpty(content))
throw new ArgumentException("'content' must have a value.", "content");

RegexOptions options = RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.IgnoreCase;
Regex tagExpr = new Regex("(?<tag><[^%/](?:.*?)>)", options);
Regex serverTagExpr = new Regex("<(?<tag>[a-z][a-z1-9]*):(?<type>[a-z][a-z1-9]*)", options);
Regex attributeExpr = new Regex("(?<name>\\S+)=[\"']?(?<value>(?:.(?![\"']?\\s+(?:\\S+)=|[>\"']))+.)[\"']?", options);

XmlDocument document = new XmlDocument();
XmlElement root = document.CreateElement("controls");

Func<XmlDocument, string, string, XmlElement> creator = (document, name, value) => {
XmlElement element = document.CreateElement(name);
element.InnerText = value;

return element;
};

foreach (Match tagMatch in tagExpr.Matches(content)) {
Match serverTagMatch = serverTagExpr.Match(tagMatch.Value);

if (serverTagMatch.Success) {
XmlElement controlElement = document.CreateElement("control");

controlElement.AppendChild(
creator(document, "tag", serverTagMatch.Groups["tag"].Value));
controlElement.AppendChild(
creator(document, "type", serverTagMatch.Groups["type"].Value));


XmlElement attributeElement = document.CreateElement("attributes");

foreach (Match attributeMatch in attributeExpr.Matches(tagMatch.Value)) {
if (attributeMatch.Success) {
attributeElement.AppendChild(
creator(document, attributeMatch.Groups["name"].Value, attributeMatch.Groups["value"].Value));
}
}

controlElement.AppendChild(attributeElement);
root.AppendChild(controlElement);
}
}

return document;
}

生成的文档可能如下所示:

<controls>
<control>
<tag>asp</tag>
<type>Content</type>
<attributes>
<ID>ph_PageContent</ID>
<ContentPlaceHolderID>ph_MainContent</ContentPlaceHolderID>
<runat>server</runat>
</attributes>
</control>
</controls>

希望对您有所帮助!

关于c# - 解析aspx文件中的控件并将其转换为xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2972167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com