2009-01-23 5 views
0

Je travaille sur un document XML avec Groovy et je teste un nœud pour un certain attribut, qui a un préfixe d'espace de nommage. Comment pourrait-il fonctionner:Groovy + XML: gérer les attributs avec Namespace-Prefix

en script groovy:

... 
Element.Subelement.each { 
    if (it.'@type'=='ns2:xyType') 
    ...do what ever... 
} 

dans le document XML:

<Element> 
    <Subelement xsi:type="ns2:xyType"> 
     <!-- or another type, want to do something with  
      subelement only if type is "ns2:xyType" --> 
    </Subelement> 
</Element> 

Vous cherchez quelque chose comme:

if (it.'@xsi:type'=='ns2:xyType') 

THX Seldon

Répondre

0

Eh bien, votre document est un peu confus, car il semble que ni les espaces de noms xsi ni ns2 n'ont jamais été déclarés, mais je vais supposer qu'ils ont été déclarés quelque part dans le document complet.

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

Pour votre exemple (note, vous devrez remplir les URL pour les espaces de noms):

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
def xsi = new groovy.xml.Namespace("http://www.w3.org/2001/XMLSchema-instance") 
node.attributes()[xsi.type] == 'my_type' 
0

Cela fonctionne bien pour moi (groovy 1.8.4). Étant donné un document 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> 

Ce assert passe:

def xml = new XmlSlurper().parseText(xmlDocStr) 
assert "woo:FAMILY" == xml.item.'@xsi:type'.text() 

Notez que vous ne devez avoir .text() bien.

0

Il est ridicule de voir comment cela n'est pas mentionné dans la documentation officielle.

Voici ce que j'ai trouvé des œuvres (Groovy 2.4)

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

Où vous passez false pour namespaceAware lorsque vous créez le ou la XmlSlurper Parser.

Questions connexes