Groovy + XML:使用Namespace-Prefix处理属性

时间:2009-01-23 07:23:05

标签: xml groovy namespaces

我正在使用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 塞尔登

4 个答案:

答案 0 :(得分:1)

好吧,你的文档有点令人困惑,因为似乎没有声明xsi和ns2名称空间,但我会假设它们已在完整文档的某处声明。

来自The Groovy Docs

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的地方。