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 . |