当前位置: 首页 > 知识库问答 >
问题:

如何使用Groovy XmlParser获取XML根元素属性,而无需对XML进行“双重解析”

郑松
2023-03-14

此简化代码正确工作:

    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()
    }
}

并产生以下正确输出:

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

版本,1.1

xmlns:xsi,http://www.w3.org/2001/XMLSchema-instance

xmlns: sfa, urn: oecd: tie: stffatcatypes: v1

xmlns: ftc, urn: oecd: tie: Fatca: v1

规格

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

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

你知道,如何产生相同的结果,而不需要双重解析整个. xml(. xml相当大),或者只提取. xml的根元素,而不使用命名空间感知解析...

共有1个答案

阎涵容
2023-03-14

通常情况下,您必须知道xml的命名空间,这样获取所需元素的代码就可以如下所示:

def 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>"""
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()
 类似资料:
  • 这是我的xml: 我为这个xml使用了JAXB和unMarshall,我可以得到描述和外部密钥。但是我不能得到有价值的属性名称。 > 这是我的java类: 组织JAVA 银行JAVA 如何获取属性名称和值?谢谢你

  • 我有一个XMLPath对象,我想为一些节点取属性名。例如, 对于这个XML,什么是XMLPath表达式来获取的属性? 我可以通过以下内容获取md:EntityDescriptor的entityID: 但是对于位置属性,我想得到 我得到的输出是,其他什么都没有。

  • 我需要标签中的属性值。< br >例如。Name xmlns:xsi = " http://www . w3 . org/2001/XML inst " xsi:space schema = " Name _ 5879 . xsd "

  • 问题内容: 我试图生成以下格式的xml: 我的查询如下: 我的查询没有完全产生记录标签,目前是 应该是 我尝试了所有可能性,但没有获得标签。谁能帮我解决这个问题。 问题答案: 我无法从xml显式获得预期的输出,相反,我使用了xml路径并获得了输出。这是我更新的查询 欢迎您发布明确使用xml的修复程序。

  • 我需要使用RSA-SHA1算法对XML文档的一个节点进行签名(并最终验证)。W3.org链接 RSA-SHA1 URI: http://www.w3.org/2000/09/XMLDSIG#RSA-SHA1 指定于: [XMLDSIG-CORE2002]第6.4.2节 签名生成发生在以下位置: 唯一带有参数的重写需要: (链接) 在.NET中用RSA-SHA1签署XML最轻松的方式是什么? 编辑:

  • 问题内容: 我正在使用Java解析Xml,我想在属性值的帮助下解析元素。 例如 在这种情况下,我想使用att值解析tag1数据。我是java和xml的新手。请引导我。 问题答案: 有多种方法可以做到这一点。您可以使用xPath(示例),DOM Document或SAX Parser(示例)来检索属性值和标记元素。 这是您要求的解决方法。我从不建议使用“ hack”类型,而是使用SAX(请参见示例链