Groovy + XML: обрабатывать атрибуты с префиксом пространства имен - PullRequest
0 голосов
/ 23 января 2009

Я работаю над XML-документом с Groovy и проверяю узел на предмет определенного атрибута, который имеет префикс пространства имен. Как это может работать:

в groovy-скрипте:

...
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 ]

1 голос
/ 04 марта 2014
def xsi = new groovy.xml.Namespace("http://www.w3.org/2001/XMLSchema-instance")  
node.attributes()[xsi.type] == 'my_type'
1 голос
/ 25 января 2009

Ваш документ немного сбивает с толку, так как кажется, что пространства имен xsi и ns2 никогда не были объявлены, но я собираюсь предположить, что они были объявлены где-то в полном документе.

С 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  
}
0 голосов
/ 03 августа 2017

Смешно, что в официальной документации нет упоминаний о том, как это сделать.

Вот что я нашел работы (Groovy 2.4)

def element = new XmlParser(false, false).parseText(xml)
assert element.Subelement.'@xsi:type' == 'ns2:xyType'

Где вы передаете false для namespaceAware при создании XmlSlurper или Parser.

0 голосов
/ 03 июня 2014

Это прекрасно работает для меня (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 ().

...