2

在我问这个问题之前,我将提供一些关于我实际尝试做的事情的信息:

我需要在我的 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的未绑定前缀,序列化失败:gg:set

The prefix "g" for element "g:set" is not bound.

现在,我有点明白我要做的不是 XML 解析和序列化的常规目的。但就我而言,我不仅希望禁用命名空间功能,还希望解析器忽略所有 GSP 标记并将它们视为常规的开始和结束标记;换句话说,忽略任何标签中的双点。

我关心的另一件事是表达语言,例如<%@ page import="<class>" %>. 现在我刚刚收到前面提到的异常,但这可能也需要解决。

非常感谢任何帮助。

4

0 回答 0