Groovy XML: как анализировать, изменять и сериализовать содержимое файла GSP. (org.xml.sax.SAXParseException, префикс не связан)
Прежде чем задать этот вопрос, я предоставлю некоторую информацию о том, что я на самом деле пытаюсь сделать:
Мне нужно провести рефакторинг большого количества файлов GSP в моем проекте Grails. После того, как я попытался написать свой собственный отличный скрипт для этого - и понял, что это слишком много для моего текущего уровня владения любым языком - я нашел эту статью, которая мне очень помогла с анализом 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
Обратите внимание, что я не хочу пролог XML в моих файлах GSP; поэтому я удаляю его с помощью регулярных выражений (это не мой вопрос, но если кто-нибудь знает более "отличный" способ сделать это, пожалуйста, дайте мне знать!)
Кроме того, я установил namespacesFeature
в ложь, так как пространства имен бесполезны для моей цели.
Поскольку это работало как HTML-файлы, я подумал, что готов рекурсивно перебрать мою папку и найти все файлы GSP с именем list.gsp
и рефакторинг их автоматически. Но когда я попытался проверить это с одним list.gsp
сериализация не удалась из-за несвязанного префикса g
для элемента g:set
:
The prefix "g" for element "g:set" is not bound.
Теперь я вроде понимаю, что то, что я пытаюсь сделать, не является обычной целью анализа и сериализации XML. Но в моем случае я не только хочу отключить функцию пространств имен, но и хочу, чтобы анализатор игнорировал все теги GSP и рассматривал их как обычные открывающие и закрывающие теги; другими словами, игнорируйте двойные точки в любом теге.
Другая вещь, которая меня беспокоит, это язык выражения, такой как <%@ page import="<class>" %>
, Прямо сейчас я получаю исключение, упомянутое ранее, но это, вероятно, также необходимо будет решить.
Любая помощь высоко ценится.