gpt4 book ai didi

java - Groovy:如何解析 xml 并保留命名空间和 schemaLocations

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:09 26 4
gpt4 key购买 nike

我正在尝试使用 groovy 将节点简单地添加到特定位置的 a 中。我的源模式如下所示

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

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

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

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

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

但是,当我这样做时,应用于根节点的命名空间和 schemaLocations 将被删除。和命名空间,但不是模式位置被添加到每个子节点。

这会导致下游出现验证问题。

我如何简单地处理这个 xml。不执行验证并保持 xml 不变并添加我指定的命名空间的单个节点?

一个注意事项:我们处理很多消息,我不会事先知道最外层的命名空间(上面示例中的 s1),但即便如此,我真的只是在寻找一种“笨拙”处理的技术的XML

谢谢!

最佳答案

首先,我必须添加 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"来定义您的 xsi 命名空间。没有它,我会收到未绑定(bind) xsi 前缀的 SAXParseException。

另外,我咨询了这个question成功地将命名空间的 xml 节点附加到现有文档。

最后,我们不得不利用 StreamingMarkupBuilder 来解决命名空间的移动问题。基本上,默认情况下序列化程序将引用的命名空间移动到实际使用命名空间的第一个节点。在您的情况下,它正在将您的 s2 命名空间属性移动到“targetNode”标签。以下代码会产生您想要的结果,但您仍然需要知道用于实例化 StreamingMarkupBuilder 的正确命名空间。

 def root = new XmlSlurper(false, true).parseText( sourceXML )
def data = '<s2:childnode5 xmlns:s2="http://localhost/s2schema">value</s2:childnode5>'
def xmlFragment = new XmlSlurper(false, true).parseText(data)
root.'aParentNode'.'targetNode'.appendNode(xmlFragment);

def outputBuilder = new StreamingMarkupBuilder()
String result = XmlUtil.serialize(outputBuilder.bind {
mkp.declareNamespace('s1':"http://localhost/s1schema")
mkp.declareNamespace('s2':"http://localhost/s2schema")
mkp.yield root }
)

关于java - Groovy:如何解析 xml 并保留命名空间和 schemaLocations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15167468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com