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
перед сериализацией измененного экземпляра обратно.
Ссылка: | Написание содержимого Groovy groovy.util.Node (XmlParser) в виде XML от нашего партнера по JCG Дастина Маркса из блога Inspired by Actual Events . |