如何使用Groovy XmlParser获得XML根元素属性,而不使用;“双重解析”;XML的应用

如何使用Groovy XmlParser获得XML根元素属性,而不使用;“双重解析”;XML的应用,xml,groovy,Xml,Groovy,此简化代码正确工作: static stringXML = '''<?xml version='1.0' encoding='UTF-8'?> <ftc:FATCA_OECD xsi:schemaLocation='urn:oecd:ties:fatca:v1 FatcaXML_v1.1.xsd' version='1.1' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:sfa='urn:

此简化代码正确工作:

    static stringXML = '''<?xml version='1.0' encoding='UTF-8'?>
    <ftc:FATCA_OECD xsi:schemaLocation='urn:oecd:ties:fatca:v1 FatcaXML_v1.1.xsd' version='1.1' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:sfa='urn:oecd:ties:stffatcatypes:v1' xmlns:ftc='urn:oecd:ties:fatca:v1'>
    <ftc:MessageSpec>Spec</ftc:MessageSpec>
</ftc:FATCA_OECD>'''
    static void main(args) {
    //NAMESPACE UNAWARE PARSING
        def rep = new XmlParser(false,false).parseText(stringXML)
        def attrMap = rep.attributes()
        attrMap.each {k,v ->
            println "$k, $v"
        }
    //NAMESPACE AWARE PARSING
        rep = new XmlParser().parseText(stringXML)
        def ftc = new groovy.xml.Namespace(attrMap['xmlns:ftc'])
        println rep[ftc.MessageSpec].text()
    }
}
static stringXML=''
规格
'''
静态空隙干管(args){
//不知道名称空间的解析
def rep=new XmlParser(false,false).parseText(stringXML)
def attrMap=rep.attributes()
attrMap.each{k,v->
打印项次“$k,$v”
}
//命名空间感知解析
rep=new XmlParser().parseText(stringXML)
def ftc=new groovy.xml.Namespace(attrMap['xmlns:ftc'])
println rep[ftc.MessageSpec].text()
}
}
并产生以下正确输出:

xsi:schemaLocation,urn:oecd:ties:fatca:v1 FatcaXML_v1.1.xsd

版本,1.1

xmlns:xsi

xmlns:sfa,urn:oecd:ties:stffatcaypes:v1

xmlns:ftc,urn:oecd:ties:fatca:v1

规格

问题是,我已经在相当广泛的代码名称空间感知解析中使用了它,我想保留它

因此,我必须像上面的代码一样使用不知道名称空间和知道名称空间的解析


您知道如何在不双重解析整个.xml(该.xml相当大)或只提取.xml的根元素的情况下生成相同的结果,而不是使用名称空间感知解析….

通常,您必须知道xml的名称空间,以便获取所需元素的代码如下所示:

def stringXML=”“”
规格
"""
def rep=new XmlParser().parseText(stringXML)
def ftc_v1=new groovy.xml.Namespace('urn:oecd:ties:fatca:v1')
println rep[ftc_v1.MessageSpec].text()
或者,您可以获取根元素的名称空间并访问具有相同名称空间的子元素
MessageSpec

def ftc_vx=new groovy.xml.Namespace(rep.name().getNamespaceURI())
println rep[ftc_vx.MessageSpec].text()
最后,这意味着您不关心名称空间,您可以使用
XmlSlurper
来访问忽略名称空间的元素:

rep=new-XmlSlurper().parseText(stringXML)
println rep.MessageSpec.text()

感谢您的回复。我当然知道那不勒斯。问题如下:1)我读了多个.xml,它们可能有不同版本的名称空间(请参阅“urn:oecd:ties:fatca:v1”),因此我必须阅读,我正在处理的版本以及基于此使用不同的名称空间。。。2) 我创建groovy对象并处理数据3)我需要在名称空间中创建output.xml,该名称空间与输入名称空间相同。所以我有两个选择。。。使用map中的属性检查名称空间版本和每个版本或更通用方法的稍微不同的代码-这是我的首选选项