Мой начальный был дан ответ на вопрос, но это только открыло новые проблемы.
Пример кода
Использование Groovy 2.0.5 JVM 1.6.0_31
import groovy.xml.*
import groovy.xml.dom.DOMCategory
def xml = '''<?xml version="1.0" encoding="UTF-16"?>
| <?xml-stylesheet type="text/xsl" href="Bp8DefaultView.xsl"?>
|<root>
| <Settings>
| <Setting name="CASEID_SEQUENCE_SIZE">
| <HandlerURL>
| <![CDATA[ admin/MainWindow.jsp ]]>
| </HandlerURL>
| </Setting>
| <Setting name="SOMETHING_ELSE">
| <HandlerURL>
| <![CDATA[ admin/MainWindow.jsp ]]>
| </HandlerURL>
| </Setting>
| </Settings>
|</root>'''.stripMargin()
def document = DOMBuilder.parse( new StringReader( xml ) )
def root = document.documentElement
// Edit: Added the line below
def pi = document.createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="Bp8DefaultView.xsl"');
// Edit #2: Added line below
document.insertBefore(pi, root)
use(DOMCategory) {
root.Settings.Setting.each {
if( it.'@name' == 'CASEID_SEQUENCE_SIZE' ) {
it[ '@value' ] = 100
}
}
}
def outputfile = new File( 'c:/temp/output.xml' )
XmlUtil.serialize( root , new PrintWriter(outputfile))
// Edit #2: Changed from root to document.documentElement to see if that
// would make any difference
println XmlUtil.serialize(document.documentElement)
Описание проблемы
Я пытаюсь проанализировать XML-файл, экспортированный из стороннего инструмента, и прежде чем продвигать его на этап и в производство, мне нужно заменить определенные значения атрибутов. Все в порядке, но вдобавок я должен сохранить кодировку и ссылку. к таблице стилей.
Поскольку это довольно статично, вполне нормально иметь и кодировку, и ссылку на таблицу стилей. определение в файле свойств, что означает: мне не нужно сначала находить объявления в исходном файле.
Кодировка в декларации
Как показано в этом ответе, найденном здесь, в StackOverFlow, вы можете сделать
new File('c:/data/myutf8.xml').write(f,'utf-8')
я тоже пробовал
XmlUtil.serialize( root , new GroovyPrintStream('c:/temp/output.txt', 'utf-16'))
но это тоже не решило проблему для меня. Так что я не понял, как переопределить значение UTF.
Проблема с инструкцией по обработке
Просто, как мне добавить
<?xml-stylesheet type="text/xsl" href="Bp8DefaultView.xsl"?>
к выходу?
Обновить. Это можно сделать следующим образом.
def pi = document.createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="Bp8DefaultView.xsl"');
Инструкция по обработке добавляется так, как мне показал это руководство, но все же Я не получаю вывод.
document.insertBefore(pi, root) // Fails