我正在使用Groovy处理XML文档,并测试某个属性的节点,该属性具有名称空间前缀。它怎么可能有效:
在groovy-script中:
...
Element.Subelement.each {
if (it.'@type'=='ns2:xyType')
...do what ever...
}
XML文档中的:
<Element>
<Subelement xsi:type="ns2:xyType">
<!-- or another type, want to do something with
subelement only if type is "ns2:xyType" -->
</Subelement>
</Element>
寻找类似的东西:
if (it.'@xsi:type'=='ns2:xyType')
THX 塞尔登
答案 0 :(得分:1)
好吧,你的文档有点令人困惑,因为似乎没有声明xsi和ns2名称空间,但我会假设它们已在完整文档的某处声明。
def wsdl = '''
<definitions name="AgencyManagementService"
xmlns:ns1="http://www.example.org/NS1"
xmlns:ns2="http://www.example.org/NS2">
<ns1:message name="SomeRequest">
<ns1:part name="parameters" element="SomeReq" />
</ns1:message>
<ns2:message name="SomeRequest">
<ns2:part name="parameters" element="SomeReq" />
</ns2:message>
</definitions>
'''
def xml = new XmlSlurper().parseText(wsdl).declareNamespace(ns1: 'http://www.example.org/NS1', ns2: 'http://www.example.org/NS2')
println xml.'ns1:message'.'ns1:part'.size()
println xml.'ns2:message'.'ns2:part'.size()
对于您的示例(请注意,您必须填写命名空间的URL):
def ggg = '''
<Element xmlns:xsi="http://www.example.org/xsi"
xmlns:ns2="http://www.example.org/NS2">
<Subelement xsi:type="ns2:xyType">
<SubSub name="bob" />
</Subelement>
</Element>
'''
def xml = new XmlSlurper().parseText(ggg).declareNamespace(xsi: 'http://www.example.org/xsi', ns2: 'http://www.example.org/NS2')
def elem = xml.'Subelement'
if ( elem.'@xsi:type'.text() == 'ns2:xyType' ){
// do it
}
答案 1 :(得分:1)
def xsi = new groovy.xml.Namespace("http://www.w3.org/2001/XMLSchema-instance")
node.attributes()[xsi.type] == 'my_type'
答案 2 :(得分:0)
这对我来说很好(groovy 1.8.4)。给定XML文档:
<container>
<item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="woo:FAMILY">
<id>111</id>
<name>Family 1</name>
</item>
</container>
此断言通过:
def xml = new XmlSlurper().parseText(xmlDocStr)
assert "woo:FAMILY" == xml.item.'@xsi:type'.text()
请注意,您必须拥有.text()。
答案 3 :(得分:0)
如何在官方文档中没有提及如何执行此操作,这是荒谬的。
这是我发现的作品(Groovy 2.4)
def element = new XmlParser(false, false).parseText(xml)
assert element.Subelement.'@xsi:type' == 'ns2:xyType'
创建XmlSlurper或Parser时传入false为namespaceAware的地方。