在我提出这个问题之前,我会提供一些关于我实际上要做的事情的信息:
我需要在grails项目中重构大量的GSP文件。在我尝试编写自己的groovy脚本之后 - 并且意识到这对于我目前使用任何语言的技能水平来说太过分了 - 我发现this article,这对解析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 prolog;因此,我使用正则表达式删除它(这不是我的问题,但如果有人知道更多&#34; groovy&#34;这样做的方式,请告诉我!)
另外,我将namespacesFeature
设置为false,因为命名空间对我来说是无用的。
因为它像HTML文件的魅力一样,我想我已经准备好递归遍历我的文件夹,找到名为list.gsp
的所有GSP文件并自动重构它们。但是当我尝试使用一个list.gsp
进行测试时,由于元素g
的未绑定前缀g:set
,序列化失败:
The prefix "g" for element "g:set" is not bound.
现在,我有点明白,我想要做的不是XML解析和序列化的常规目的。但就我而言,我不仅希望禁用命名空间功能,还希望解析器忽略所有GSP标记并将它们视为常规的开始和结束标记;换句话说,忽略任何标签中的双点。
我关心的另一件事是表达语言,例如<%@ page import="<class>" %>
。现在我刚刚得到前面提到的例外,但这可能也需要解决。
任何帮助都是非常苛刻的。