相关疑难解决方法(0)

Groovy:如何解析xml并保留名称空间和schemaLocations

我正在尝试使用groovy来简单地将节点添加到特定位置.我的源架构看起来像这样

<s1:RootNode
   xmlns:s1="http://localhost/s1schema"
   xmlns:s2="http://localhost/s2schema"
   xsi:schemaLocation="http://localhost/s1schema s1schema.xsd 
   http://localhost/s2schema s2schema.xsd">
 <s1:aParentNode>
  <s2:targetNode>
   <s2:childnode1 />
   <s2:childnode2 />
   <s2:childnode3 />
   <s2:childnode4 />
 </s2:targetNode>
</s1:aParentNode>
</s1:RootNode>
Run Code Online (Sandbox Code Playgroud)

我想简单地添加一个与其他子节点内联的新子节点来进行输出

<s1:RootNode
    xmlns:s1="http://localhost/s1schema"
    xmlns:s2="http://localhost/s2schema"
    xsi:schemaLocation="http://localhost/s1schema s1schema.xsd 
    http://localhost/s2schema s2schema.xsd">
 <s1:aParentNode>    
   <s2:targetNode>
     <s2:childnode1 />
     <s2:childnode2 />
     <s2:childnode3 />
     <s2:childnode4 />
     <s2:childnode5 >value</s2:childnode5>
   </s2:targetNode>
  </s1:aParentNode>
 </s1:RootNode>
Run Code Online (Sandbox Code Playgroud)

为此,我有以下简单的groovy脚本

  def data = 'value'
def root = new XmlSlurper(false,true).parseText( sourceXML )
        root.'aParentNode'.'topNode'.appendNode{
            's2:childnode5' data
        }
groovy.xml.XmlUtil.serialize(root);
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,将删除应用于根节点的名称空间和schemaLocations.和命名空间,但没有将架构位置添加到每个子节点.

这导致下游的验证问题.

我如何简单地处理这个xml.不执行验证并按原样保留xml并添加我指定的命名空间的单个节点?

一个注意事项:我们处理了很多消息,我不会事先知道最外面的命名空间(上例中的s1),但即便如此,我真的只是想看一种技术,它是xml的"笨"处理

谢谢!

java groovy

6
推荐指数
1
解决办法
1669
查看次数

Groovy:如何在使用XMLSlurper()读入的XML元素列表的开头插入一个节点

我可能错过了一些显而易见的东西,因为我是Groovy的菜鸟,但是我已经搜索过但却找不到我正在寻找的东西.我有一个测试类,我正在阅读一些XML; 我想一系列元素的开头插入一个元素.我已经想出如何替换第一个元素,并且我已经想出如何一个节点附加到列表的末尾,但我似乎无法理解如何在列表的开头插入一个元素(或者理想情况下,任意位置).

例如:

@Test
void foo()
{
    def xml = """<container>
                   <listofthings>
                       <thing id="100" name="foo"/>
                   </listofthings>
                 </container>"""

    def root = new XmlSlurper().parseText(xml)
    root.listofthings.thing[0].replaceNode ( { thing(id:101, name:'bar') })
    root.listofthings.appendNode  ( { thing(id:102, name:'baz') })

    def outputBuilder = new groovy.xml.StreamingMarkupBuilder()
    String result = outputBuilder.bind { mkp.yield root }
    print result
}
Run Code Online (Sandbox Code Playgroud)

产量:

<container>
   <listofthings>
     <thing id='101' name='bar'/>
     <thing id='102' name='baz'/>
   </listofthings>
</container>
Run Code Online (Sandbox Code Playgroud)

我真正想要的是在插入点开始listofthings,即东西来取代调用replaceNode将ID为100之前的事情,而不是插入一个ID为101的事情,我也将是如果说不好听,我有一个更长的列表,在第n个元素之后插入一个节点.

(顺便提一下,有没有办法以更易读的格式获取输出?StreamingMarkupBuilder的输出都以一行文本结尾;为了清楚起见,我重新格式化了它)

编辑:我正在使用1.7.5,它与Eclipse捆绑在一起,如果重要的话.

xml groovy

5
推荐指数
1
解决办法
6856
查看次数

标签 统计

groovy ×2

java ×1

xml ×1