Статьи

Написание содержимого Groovy groovy.util.Node (XmlParser) в виде XML

Groovy XmlParser позволяет легко анализировать файл XML, входной поток XML или строку XML, используя один из его перегруженных методов анализа (или parseText в случае String ). Содержимое XML, проанализированное любым из этих методов, становится доступным как экземпляр groovy.util.Node . В этом блоге описывается, как совершить обратную поездку и записать содержимое Node обратно в XML в альтернативных форматах, таких как File или String .

MarkupBuilder в Groovy предоставляет удобный подход для генерации XML из кода Groovy. Например, я продемонстрировал написание XML на основе результатов SQL-запросов в публикациях GroovySql и MarkupBuilder: SQL-to-XML . Однако, когда кто-то хочет написать / сериализовать XML из Groovy Node , простой и подходящий подход заключается в использовании XmlNodePrinter, как показано в разделе «Обновление XML с помощью XmlParser» .

Следующий листинг кода, parseAndPrintXml.groovy демонстрирует использование XmlParser для анализа XML из предоставленного файла и использование XmlNodePrinter для записи этого Node проанализированного из файла, в стандартный вывод в виде XML.

parseAndPrintXml.groovy: запись XML в стандартный вывод

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
#!/usr/bin/env groovy
 
// parseAndPrintXml.groovy
//
// Uses Groovy's XmlParser to parse provided XML file and uses Groovy's
// XmlNodePrinter to print the contents of the Node parsed from the XML with
// XmlParser to standard output.
 
if (args.length < 1)
{
   println "USAGE: groovy parseAndPrintXml.groovy <XMLFile>"
   System.exit(-1)
}
 
XmlParser xmlParser = new XmlParser()
Node xml = xmlParser.parse(new File(args[0]))
XmlNodePrinter nodePrinter = new XmlNodePrinter(preserveWhitespace:true)
nodePrinter.print(xml)

Если оставить в стороне комментарии и код для проверки аргументов командной строки, в приведенном выше списке кода, имеющем значение для этого обсуждения, действительно есть 4 строки (строки 15-18). Эти четыре строки демонстрируют создание экземпляра XmlParser (строка 15), использование экземпляра XmlParser для «анализа» экземпляра File на основе предоставленного имени файла аргумента (строка 16), создание экземпляра XmlNodePrinter (строка 17) и использование этого экземпляра XmlNodePrinter для «Распечатать» разобранный XML на стандартный вывод (строка 18).

Хотя запись XML в стандартный вывод может быть полезной для пользователя, чтобы просмотреть или перенаправить вывод в другой скрипт или инструмент, бывают случаи, когда более полезно иметь доступ к проанализированному XML в виде строки. Следующий листинг кода немного сложнее, чем предыдущий, и демонстрирует использование XmlNodePrinter для записи проанализированного XML, содержащегося в экземпляре Node в виде String Java.

parseXmlToString.groovy: запись XML в строку Java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env groovy
 
// parseXmlToString.groovy
//
// Uses Groovy's XmlParser to parse provided XML file and uses Groovy's
// XmlNodePrinter to write the contents of the Node parsed from the XML with
// XmlParser into a Java String.
 
if (args.length < 1)
{
   println "USAGE: groovy parseXmlToString.groovy <XMLFile>"
   System.exit(-1)
}
 
XmlParser xmlParser = new XmlParser()
Node xml = xmlParser.parse(new File(args[0]))
StringWriter stringWriter = new StringWriter()
XmlNodePrinter nodePrinter = new XmlNodePrinter(new PrintWriter(stringWriter))
nodePrinter.setPreserveWhitespace(true)
nodePrinter.print(xml)
String xmlString = stringWriter.toString()
println "XML as String:\n${xmlString}"

Как показывает только что показанный листинг кода, можно создать экземпляр экземпляра XmlNodePrinter который XmlNodePrinter запись в PrintWriter, который был создан с помощью StringWriter . Этот StringWriter конечном итоге делает XML доступным в виде String Java.

Запись XML из groovy.util.Node в File очень похожа на запись его в String с FileWriter, используемым вместо StringWriter . Это продемонстрировано в следующем листинге кода.

parseAndSaveXml.groovy: записать XML в файл

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env groovy
 
// parseAndSaveXml.groovy
//
// Uses Groovy's XmlParser to parse provided XML file and uses Groovy's
// XmlNodePrinter to write the contents of the Node parsed from the XML with
// XmlParser to file with provided name.
 
if (args.length < 2)
{
   println "USAGE: groovy parseAndSaveXml.groovy <sourceXMLFile> <targetXMLFile>"
   System.exit(-1)
}
 
XmlParser xmlParser = new XmlParser()
Node xml = xmlParser.parse(new File(args[0]))
FileWriter fileWriter = new FileWriter(args[1])
XmlNodePrinter nodePrinter = new XmlNodePrinter(new PrintWriter(fileWriter))
nodePrinter.setPreserveWhitespace(true)
nodePrinter.print(xml)

Я не показываю это в этом посте, но ценность возможности выписать Node обратно в виде XML часто приходит после модификации этого экземпляра Node . Обновление XML с помощью XmlParser демонстрирует тип функциональности, которую можно выполнить на Node перед сериализацией измененного экземпляра обратно.