【问题标题】:Groovy+ XML: handle Attributes with Namespace-PrefixGroovy+ XML:使用命名空间前缀处理属性
【发布时间】:2009-01-23 07:23:04
【问题描述】:

我正在使用 Groovy 处理 XML 文档,并测试一个节点的某个属性,该属性具有命名空间前缀。它是如何工作的:

在常规脚本中:

...
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 谢顿

【问题讨论】:

    标签: xml groovy namespaces


    【解决方案1】:

    官方文档中没有提到如何做到这一点,这很荒谬。

    这是我发现的作品 (Groovy 2.4)

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

    在创建 XmlSlurper 或 Parser 时为 namespaceAware 传入 false。

    【讨论】:

      【解决方案2】:

      好吧,您的文档有点混乱,因为似乎从来没有声明过 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  
      }
      

      【讨论】:

        【解决方案3】:
        def xsi = new groovy.xml.Namespace("http://www.w3.org/2001/XMLSchema-instance")  
        node.attributes()[xsi.type] == 'my_type'
        

        【讨论】:

          【解决方案4】:

          这对我来说很好(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()。

          【讨论】:

            猜你喜欢
            • 2012-05-27
            • 2021-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-22
            • 2013-09-24
            相关资源
            最近更新 更多