使用命名空间进行 Groovy Xml 解析

发布于 2024-09-17 07:25:37 字数 1401 浏览 8 评论 0原文

我一直在尝试使用 groovy 的 XML Slurper 进行一些 xml 修改。

基本上,我正在浏览 xml 并寻找具有 ? 的标签或属性。作为值,然后用某个值替换它。

我已经让它适用于没有命名空间的 xml,但是一旦我包含它们,事情就会变得不稳定。例如,这个:

   String foo = "<xs:test xmlns:xs="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:foo="http://myschema/xmlschema" name='?'>
        <foo:tag1>?</foo:tag1>
        <foo:tag2>?</foo:tag2>
    </xs:test>";

产生:

这是我正在使用的常规代码。当我不使用命名空间时,这似乎确实有效:

 public def populateRequest(xmlString, params) {

     def slurper = new XmlSlurper().parseText(xmlString)
     //replace all tags with ?
     def tagsToReplace = slurper.depthFirst().findAll{ foundTag ->
        foundTag.text() == "?"
     }.each { foundTag ->
        foundTag.text = {webServiceOperation.parameters[foundTag.name()]}
       foundTag.replaceNode{
            "${foundTag.name()}"(webServiceOperation.parameters[foundTag.name()])
        }
      }
      //replace all attributes with ?
      def attributesToReplace = slurper.list().each{
          it.attributes().each{ attributes ->
          if(attributes.value == '?')
          {
            attributes.value = webServiceOperation.parameters[attributes.key]
          }
        }
      }

      new StreamingMarkupBuilder().bind { mkp.yield slurper }.toString()
   }

I've been trying to do some xml modifications with groovy's XML Slurper.

Basically, i'm going through the xml and looking for tags or attributes that have ? as the value and then replacing it with some value.

I've got it working for xml that doesn't have namespaces but once I include them things get wonky. For example, this:

   String foo = "<xs:test xmlns:xs="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:foo="http://myschema/xmlschema" name='?'>
        <foo:tag1>?</foo:tag1>
        <foo:tag2>?</foo:tag2>
    </xs:test>";

produces:

<Envelope/>

Here's the groovy code I'm using. This does appear to work when I am not using a namespace:

 public def populateRequest(xmlString, params) {

     def slurper = new XmlSlurper().parseText(xmlString)
     //replace all tags with ?
     def tagsToReplace = slurper.depthFirst().findAll{ foundTag ->
        foundTag.text() == "?"
     }.each { foundTag ->
        foundTag.text = {webServiceOperation.parameters[foundTag.name()]}
       foundTag.replaceNode{
            "${foundTag.name()}"(webServiceOperation.parameters[foundTag.name()])
        }
      }
      //replace all attributes with ?
      def attributesToReplace = slurper.list().each{
          it.attributes().each{ attributes ->
          if(attributes.value == '?')
          {
            attributes.value = webServiceOperation.parameters[attributes.key]
          }
        }
      }

      new StreamingMarkupBuilder().bind { mkp.yield slurper }.toString()
   }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最丧也最甜 2024-09-24 07:25:38

来自 groovy 文档

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

from groovy documentation

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()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文