groovy.xml.XMLParser выдает синтаксический анализ уникальных атрибутов, разделенных двоеточием

#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" и может быть другим.