我正在尝试使用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的"笨"处理
谢谢!
我可能错过了一些显而易见的东西,因为我是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捆绑在一起,如果重要的话.