Анализ XML с помощью Groovy: переопределить кодировку в объявлении и добавить инструкцию обработки XML

Мой начальный был дан ответ на вопрос, но это только открыло новые проблемы.

Пример кода

Использование 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

person rhellem    schedule 03.12.2012    source источник
comment
Похоже, мне просто не нужно заботиться о проблеме кодирования, нашел этот вопрос Почему createProcessingInstruction в VBA генерирует неполный вывод?   -  person rhellem    schedule 08.12.2012
comment
Понимая, что этот вопрос был немного двусмысленным, я создал новый, сосредоточившись только на инструкции по обработке, см. /groovy-and-xml-not-able-to-insert-processing-instruction   -  person rhellem    schedule 09.12.2012


Ответы (1)


На все вопросы в этом вопросе был дан ответ в другом вопросе, который я поднял, см. Groovy и XML: невозможно вставить инструкцию по обработке

Хитрость в том, что я ожидал

document.documentElement

содержать инструкцию по обработке. Но это неправильно, documentElement:

...Это удобный атрибут, который обеспечивает прямой доступ к дочернему узлу, который является элементом документа документа...

Где инструкция обработки — это просто еще один дочерний узел. Вместо этого мне пришлось использовать либо LSSerializer, либо Transfomer. Дополнительные сведения см. в разделе инструкции по сериализации обработки XML перед корневым элементом.

person rhellem    schedule 09.12.2012