#xml #groovy
Вопрос:
Я написал отличный скрипт, объединяющий части с соответствующими атрибутами в новый xml-файл. В качестве идентификатора я использую список элементов из CSV-файла. Если совпадение найдено с помощью синтаксического анализатора xml groovy, я добавляю весь элемент узла в выходной xml-файл.
Но входные и выходные данные узлов различаются.
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:int">3</value>
На выходе получается:
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:int">3</value>
xmlns:xsi и xmlns:xs являются уникальными идентификаторами, а синтаксис является правильным xml. Но после использования groovy.xml.XMLParser остается только первый атрибут.
Является ли это ошибкой groovy.xml.XMLParser?
Вот мой короткий пример для проверки такого поведения:
import groovy.xml.XmlParser
class CreateSelectedXML {
static void xmlHandling(List<String> listCodes, String TEST_FILE_NAME) {
def docdup = new StringBuilder()
listCodes.each { code ->
File input = new File(TEST_FILE_NAME)
def doc = new XmlParser().parse(input)
doc.findAll{it.@code == code[0].toString()}.each {
def temp
temp = groovy.xml.XmlUtil.serialize(it).toString()
docdup.append(temp)
}
}
}
}
}
Ответ №1:
xmlns:...
на самом деле это не атрибут — это объявление пространства имен.
и пространство xs
имен, объявленное с xmlns:xs
, не используется в вашем xml. вот почему после сериализации его там нет.
хорошее объяснение пространств имен в xml: https://www.w3schools.com/xml/xml_namespaces.asp
однако вы можете указать XMLParser игнорировать пространства имен — тогда xmlns:xs
они будут обрабатываться как обычный атрибут xml и будут сериализованы после синтаксического анализа.
def parser = new XmlParser(false,false)
<a rel=»noreferrer noopener nofollow» href=»https://docs.groovy-lang.org/latest/html/api/groovy/xml/XmlParser.html#(boolean,boolean)» rel=»nofollow noreferrer»>https://docs.groovy-lang.org/latest/html/api/groovy/xml/XmlParser.html#(логическое,логическое)
примечание: xs
xmlns:xs="http://www.w3.org/2001/XMLSchema"
это похоже на ярлык/имя переменной для значения "http://www.w3.org/2001/XMLSchema"
и может быть другим.