假设我有一个已经标记化的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
答案 0 :(得分:0)
如果我们可以假设html符合xml,那么xslt将是一种方法。但我认为这样做会因为你似乎想要编写自己的解析器(不知道为什么)。 如果你真的想编写解析器(我编写解析规则,而不是你自己的解析器引擎),请看一下antlr和MS oslo。
答案 1 :(得分:0)
解析/遍历XML / HTML树有多种方法。也许我可以指出: -
http://razorsharpcode.blogspot.com/2009/10/combined-pre-order-and-post-order-non.html
如果您想对DOM元素进行预订或后序操作,可以使用那里描述的算法。