在我问这个问题之前,我将提供一些关于我实际尝试做的事情的信息:
我需要在我的 grails 项目中重构大量 GSP 文件。在我尝试为此编写自己的 groovy 脚本后——并意识到这对于我目前的任何语言技能水平来说都太过分了——我发现了这篇文章,它对我解析 html 内容有很大帮助。
过了一会儿,我整理了自己的脚本来解析一个 html 文件,再次序列化它并将其保存到一个新文件中。这是我的脚本:
import groovy.xml.*
@Grab(group='org.ccil.cowan.tagsoup',module='tagsoup', version='1.2' )
def tagsoupParser = new org.ccil.cowan.tagsoup.Parser()
tagsoupParser.setFeature(tagsoupParser.namespacesFeature, false)
def slurper = new XmlSlurper(tagsoupParser)
def xmlFile = 'list.gsp'
def htmlParser = slurper.parse(xmlFile)
/*
TODO: Manipulation code goes here
*/
def outputBuilder = new StreamingMarkupBuilder()
String result = XmlUtil.serialize(outputBuilder.bind{ mkp.yield htmlParser })
result = result.replaceAll(/<\?.+\?>/, '')
def newFile = new File('neu.html')
newFile.text = result
请注意,我不想在我的 GSP 文件中使用 XML 序言;因此,我使用正则表达式删除它(这不是我的问题,但如果有人知道更“时髦”的方式来做到这一点,请告诉我!)
此外,我设置namespacesFeature
为 false,因为命名空间对我的目的没有用。
因为这就像 HTML 文件的魅力一样,我想我已经准备好递归地遍历我的文件夹并找到所有具有该名称的 GSP 文件list.gsp
并自动重构它们。但是当我尝试用 one 测试它时,由于元素list.gsp
的未绑定前缀,序列化失败:g
g:set
The prefix "g" for element "g:set" is not bound.
现在,我有点明白我要做的不是 XML 解析和序列化的常规目的。但就我而言,我不仅希望禁用命名空间功能,还希望解析器忽略所有 GSP 标记并将它们视为常规的开始和结束标记;换句话说,忽略任何标签中的双点。
我关心的另一件事是表达语言,例如<%@ page import="<class>" %>
. 现在我刚刚收到前面提到的异常,但这可能也需要解决。
非常感谢任何帮助。