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

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

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

我的xml文件是

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

===============>>#1 票数:5 已采纳

Xml解析器不理解ASP指令:<%@ <%=等。

您可能最好使用正则表达式来完成此操作,可能分为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>

希望有所帮助!

===============>>#2 票数:2

我在上面的代码中使用了以下三个正则表达式,它也给了我html标签。 此外,我也可以获得开始和结束标签之间的值。

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

===============>>#3 票数:1

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

上面的通用模板将工作在version 3.5及更高version 3.5 ..所以如果任何一个使用下面的版本,创建函数如:

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

    return element;
}

这会奏效

===============>>#4 票数:0

如果标记的代码是在多行中写入的,那么我们在提取标记数据时可能会遇到问题。 避免我从我们传递给上述函数的源字符串中删除了下面的换行符(内容)

string contentRemovedNewLines = Regex.Replace(content, @"\t|\n|\r", "");

那么我们可以使用contentRemovedNewLines而不是content。

上面的代码按我的意愿工作。 还可以添加一件事。 你可以调用上面的方法,如下所示,然后保存为xml文件,这样我们就可以检查预期的结果是否存在。

XmlDocument xmlDocWithWebContent = CreateDocumentFromMarkup(sourceToRead);

string xmlfileLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "tempXmlOutputFileOfWebSource.xml";

xmlDocWithWebContent.Save(xmlfileLocation);

要做到这一点,我们必须有一个xml文件的根元素

            XmlDocument document = new XmlDocument();
            XmlNode xmlNode = document.CreateNode(XmlNodeType.XmlDeclaration, "", "");
            XmlElement root = document.CreateElement("controls");
            document.AppendChild(root);

我使用了上面的修复程序

===============>>#5 票数:0

ASPX文件应该是有效的XML,因此XSLT可能是一个很好的解决方案。 W3学校网站有很好的介绍和参考。 然后,您可以从一个简单的程序调用此XSLT来选择所需的文件。

或者,您可以使用Linq to XML加载ASPX文件并以Linq样式迭代控件。

  ask by Ubaid translate from so

未解决问题?本站智能推荐:

2回复

将图片网址存储在xml中,并将其包含在ASPX页面C#中

我有一个ASPX页面,我在其中使用很多图像,并且也多次使用同一图像。 所以我想到将图像存储在xml中,然后再使用图像。 我是xml的新手。 以下是xml部分。 如何将图像从xml调用到我的ASPX页面? 任何想法或链接都会有所帮助。 以下是我在ASPX页面中使用div中的图像U
1回复

尝试将xml文件解析为C#aspx.net中的对象

我在尝试将XML文件序列化为对象时遇到问题。 我让它在另一个项目中工作,但是这次不起作用。 对象及其元素始终为空。 我的XML文件: 我的课: 我的序列化方法:
1回复

SQL Server返回具有XML数据类型的Select语句,并将其转换为C#,ASP.Net中的DataSet

在数据库表中,我具有XML数据类型的列名“ SectionDatatable”。 在我的C#代码中,当我将数据库连接到数据库并查询以获取SectionDatatable时,该数据是数据库中的XML格式UserDefinedSectionData。 我需要转换XML数据类型中的'Section
2回复

从文本文件读取并将其写入XML

我想读取一个文本文件并将其写到现有的XML文件上。 文本文件格式为 我希望将XML文件的输出为:
1回复

将对象序列化为XML并将其附加到XML文件

我正在尝试将(马)对象转换为XmlElement,以便可以将其附加到XML文件。 这是我最近尝试过的。 不幸的是,一旦我到达root.AppendChild(horseEl)行,就会引发以下异常:“ System.Xml.dll中发生了'System.ArgumentException
1回复

将XML文件转换为数据库中的表,包括列名

我有以下xml文件 我需要在数据库中创建一个表,其中Question的值成为列名,而Answers使用C#和ASP.NET进入行 任何帮助,将不胜感激。 这是预期的格式。
1回复

将xml文件组转换为.mdf文件

我以前使用asp在数据驱动的网站上工作。 NET和SQL Server。 这涉及从数据库检索记录并显示在网页上。 现在,我在服务器上有一些带有xml文件的文件夹。 我必须创建一个Asp网站,该网站使用文件夹名称进行搜索,并从选定的xml文件中检索其他信息。 我认为如果它位于数据库.md
2回复

将aspx文件加载到xmldocument中

我希望能够将aspx页面加载到XmlDocument变量中。 我怎么做? 这是我尝试过的和它期待的.xml文件而不是.aspx页面。 有没有办法将aspx页面即时转换为xml文档并加载它? 谢谢 我收到以下错误: 名称不能以'%'字符开头,十六进制值0x25。 第1行,第
1回复

从另一个aspx页面中取出xml

我在一个解决方案中有2个项目(项目A和项目B)。 项目B - default.aspx页面在load函数中有以下代码,它返回xml。 现在,我在Project A上有一个按钮 - default.aspx页面。 我想在项目A default.aspx页面的按钮单击上获取该xml数
2回复

从ASPX页面读取Flash中的XML

我创建了一个aspx页面,该页面动态创建了一个xml字符串并将其发布回客户端。 它创建有效的XML,并且当我将此代码保存到静态.xml文件时,闪存可以很好地读取它,尽管当它尝试从ASPX读取它时,它失败并显示“ 1090 XML解析器故障:元素格式错误”。 我没有http压缩。