Unfortunately in real life 99% of the XML HAS namespaces :o(
Here is an example, the source XML is:
<?xml version="1.0" encoding="UTF-8"?> <cus:Customizations xmlns:cus="http://www.bea.com/wli/config/customizations" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xt="http://www.bea.com/wli/config/xmltypes"> <cus:customization xsi:type="cus:EnvValueCustomizationType"> <cus:description/> <cus:envValueAssignments> <xt:envValueType>UDDI Auto Publish</xt:envValueType> <xt:location xsi:nil="true"/> <xt:owner> <xt:type>ProxyService</xt:type> <xt:path>OSBProject1/ProxyService1</xt:path> </xt:owner> <xt:value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">false</xt:value> </cus:envValueAssignments> <cus:envValueAssignments> <xt:envValueType>Service URI</xt:envValueType> <xt:location xsi:nil="true"/> <xt:owner> <xt:type>ProxyService</xt:type> <xt:path>OSBProject1/ProxyService1</xt:path> </xt:owner> <xt:value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">/OSBProject1/ProxyServicePippo</xt:value> </cus:envValueAssignments> </cus:customization> <cus:customization xsi:type="cus:FindAndReplaceCustomizationType"> <cus:description/> <cus:query> <xt:resourceTypes>ProxyService</xt:resourceTypes> <xt:envValueTypes>UDDI Auto Publish</xt:envValueTypes> <xt:envValueTypes>Service URI</xt:envValueTypes> <xt:refsToSearch xsi:type="xt:ResourceRefType"> <xt:type>ProxyService</xt:type> <xt:path>OSBProject1/ProxyService1</xt:path> </xt:refsToSearch> <xt:includeOnlyModifiedResources>false</xt:includeOnlyModifiedResources> <xt:searchString>Search String</xt:searchString> <xt:isCompleteMatch>false</xt:isCompleteMatch> </cus:query> <cus:replacement>Replacement String</cus:replacement> </cus:customization> <cus:customization xsi:type="cus:ReferenceCustomizationType"> <cus:description/> </cus:customization> </cus:Customizations>
The Groovy-XmlParser is:
def customizations = new XmlParser().parse("ALSBCustomizationFile.xml") def cus = new groovy.xml.Namespace("http://www.bea.com/wli/config/customizations") def xt = new groovy.xml.Namespace("http://www.bea.com/wli/config/xmltypes") def xsi = new groovy.xml.Namespace("http://www.w3.org/2001/XMLSchema-instance") customizations[cus.customization].each { if (it.attributes()[xsi.type] == 'cus:EnvValueCustomizationType') { println "FOUND!" } def values = it[cus.envValueAssignments][xt.envValueType] for (value in values) { print value } }
Result:
FOUND!
{http://www.bea.com/wli/config/xmltypes}envValueType[attributes={}; value=[UDDI Auto Publish]]{http://www.bea.com/wli/config/xmlty
pes}envValueType[attributes={}; value=[Service URI]]
The Groovy-XmlSlurper way is:
def customizations = new XmlSlurper().parse("ALSBCustomizationFile.xml").declareNamespace(xt: 'http://www.bea.com/wli/config/xmltypes',xsi: 'http://www.w3.org/2001/XMLSchema-instance', cus : 'http://www.bea.com/wli/config/customizations') println customizations customizations.'cus:customization'.each { println "UNO" if (it.'@xsi:type' == "cus:EnvValueCustomizationType") { println "TROVATO" } }
The very annoying difference between XmlParser and XmlSlurper is that in the first you use ns.part and in the other ns:part
2 comments:
You can also initialize XmlSlurper to ignore Namespaces: http://groovy.codehaus.org/api/groovy/util/XmlSlurper.html#XmlSlurper(boolean, boolean)
new XmlSlurper(false, false)
Same goes for XmlParser:
http://groovy.codehaus.org/api/groovy/util/XmlParser.html#XmlParser(boolean, boolean)
new XmlParser(false, false)
In this way you can reference a node without having to declare the namespaces.
Luciano: good point. Can you please add a working example of your idea when adding a node with namespace in it is involved? thanks.
Post a Comment