XMLSlurper внутри скрипта Groovy не работает для простого XML

#java #groovy #xmlslurper

#ява #заводной #xmlslurper #java #groovy

Вопрос:

Я пытаюсь проанализировать XML с помощью плагина XMLSlurper от Groovy Script. Мне нужно прочитать значение в элементе d:editStatus.

 import groovy.xml.*;
def myxml = '<?xml version="1.0" encoding="utf-8"?>'  
'<feed xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">'  
    '<entry>'  
        '<content type="application/xml">'  
            '<m:properties>'  
                '<d:key>JobApplication/applicationId=94319</d:key>'  
                '<d:status>OK</d:status>'  
                '<d:editStatus>UPDATED</d:editStatus>'  
                '<d:message>Application has been updated successfully</d:message>'  
                '<d:index m:type="Edm.Int32">0</d:index>'  
                '<d:httpCode m:type="Edm.Int32">204</d:httpCode>'  
                '<d:inlineResults m:type="Bag(SFOData.UpsertResult)"></d:inlineResults>'  
            '</m:properties>'  
        '</content>'  
    '</entry>'  
    '</feed>'


def mystatus = new XmlSlurper().parseText(myxml)

println mystatus
  

Здесь выходные данные должны были показывать объектную форму xml, но это дает мне следующий вывод

 JobApplication/applicationId=94319OKUPDATEDApplication has been updated successfully0204
  

Это очень странно, так как я не вижу никаких элементов, это объединение всех значений и отображение в качестве выходных данных. Я не могу извлечь ни одного элемента.

Комментарии:

1. println myxml.entry.content.properties.editStatus

Ответ №1:

Распечатка значения вашего GPathResult по умолчанию распечатает все значения его узлов.

Для извлечения значений отдельных узлов:

 import groovy.xml.*

def myxml = '''
    <feed xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
        <entry>
            <content type="application/xml">
                <m:properties>
                    <d:key>JobApplication/applicationId=94319</d:key>
                    <d:status>OK</d:status>
                    <d:editStatus>UPDATED</d:editStatus>
                    <d:message>Application has been updated successfully</d:message>
                    <d:index m:type="Edm.Int32">0</d:index>
                    <d:httpCode m:type="Edm.Int32">204</d:httpCode>
                    <d:inlineResults m:type="Bag(SFOData.UpsertResult)"></d:inlineResults>
                </m:properties>
            </content>
        </entry>
    </feed>
'''


def xml = new XmlSlurper().parseText(myxml)

println "key: ${xml.entry.content.properties.key}"
println "status: ${xml.entry.content.properties.status}"
println "editStatus: ${xml.entry.content.properties.editStatus}"
println "message: ${xml.entry.content.properties.message}"
println "index: ${xml.entry.content.properties.index}"
println "httpCode: ${xml.entry.content.properties.httpCode}"
println "inlineResults: ${xml.entry.content.properties.inlineResults}"
  

Вы также можете извлечь значение атрибута узла с помощью @

 println xml.entry.content.@type
  

Комментарии:

1. да, это работает отлично. Спасибо за полезный совет по атрибутам