2

假设我有一个已标记化的 HTML 文档,如何将其转换为新文档或应用其他一些转换?

例如,假设我有这个 HTML:

<html>
 <body>
  <p><a href="/foo">text</a></p>
  <p>Hello <span class="green">world</span></p>
 </body>
</html>

我目前写的是一个输出标记流的标记器。对于本文档,它们将是(用伪代码编写):

TAG_OPEN[html] TAG_OPEN[body] TAG_OPEN[p] TAG_OPEN[a] TAG_ATTRIBUTE[href]
TAG_ATTRIBUTE_VALUE[/foo] TEXT[text] TAG_CLOSE[a] TAG_CLOSE[p]
TAG_OPEN[p] TEXT[Hello] TAG_OPEN[span] TAG_ATTRIBUTE[class]
TAG_ATTRIBUTE_VALUE[green] TEXT[world] TAG_CLOSE[span] TAG_CLOSE[p]
TAG_CLOSE[body] TAG_CLOSE[html]

但现在我不知道如何使用这个流来创建一些转换。

例如,我想改写TAG_ATTRIBUTE_VALUE[/foo]TAG_OPEN[a] TAG_ATTRIBUTE[href]别的东西。

我想做的另一个转换是让它在括号TAG_ATTRIBUTE[href]后输出属性TAG_OPEN[a],例如,

<a href="/foo">text</a>

被重写为

<a href="/foo">text</a>(/foo)

进行此类转换的一般策略是什么?我想做很多其他的转换,比如剥离所有标签并只留下 TEXT 内容,在某些特定标签之后添加标签等。

我需要创建解析树吗?我从来没有做过,也不知道如何从令牌流中创建解析树。或者我可以以其他方式做到这一点吗?

欢迎任何建议。

还有一件事 - 我想自己学习所有这些解析,所以我不是在寻找图书馆!

预先感谢, Boda Cydo

4

2 回答 2

0

如果我们可以假设 html 是 xml 兼容的,那么 xslt 将是一种方法。但我假设这会出局,因为您似乎想编写自己的解析器(不知道为什么)。如果您真的想编写解析器(我会编写解析规则,而不是您自己的解析器引擎),请查看 antlr 和 MS oslo。

于 2010-02-21T20:47:18.127 回答
0

有多种方法可以解析/遍历 XML/HTML 树。也许我可以指出你:-

http://razorsharpcode.blogspot.com/2009/10/combined-pre-order-and-post-order-non.html

如果您想对 DOM 元素进行预排序或后排序操作,可以使用此处描述的算法。

于 2010-02-21T20:50:46.167 回答