如何使用Qt 5和XQuery将一个元素替换为另一个XML文件中的元素

时间:2016-01-22 14:45:10

标签: c++ xml qt xquery

我一直在尝试用另一个具有相同元素的XML文件中的内容替换一个元素(及其子元素)。

示例:

FILEA:

<A>
    <B id="1">
        // more sub elements  
    </B>
    <B id="2">
        // more sub elements  
    </B>
</A>

FILEB

<A>
    <B id="1">
        // other sub elements than FileA has
    </B>
</A>

从这个来源: http://docs.basex.org/wiki/XQuery_Update

我尝试了以下内容:

copy $c := doc('FileA')
modifiy (
    replace node $c/A/B[@id='1'] with element doc('FileB')/A/B[@id='1']
)
return $c

Qt的xmlpatterns不支持此功能。我已尝试过上面代码的不同版本,但没有运气。我已经使用XQuery获取部分XML文件,但我还没有找到解决方法来解决这个问题。

也许Qt的工具支持它?我无法在Qt的网页上找到关于如何做类似事情的任何事情(xmlprocessing)。

1 个答案:

答案 0 :(得分:1)

XQuery Update是XQuery的补充。根据{{​​3}}描述的内容,不支持XQuery Update。

由于不支持在没有XQuery Update的情况下修改元素,因此您必须重新构建整个树,并应用一些修改。对于一般用法,可以使用公共Qt 5 XQuery documentation来实现,但是对于没有嵌套元素的相当简单的结构,通过对结构进行硬编码,您可以更轻松地执行此操作。

<A>{
for $B-fileA in doc('/tmp/a.xml')/A/B
let $B-fileB := doc('/tmp/b.xml')/A/B[@id = $B-fileA/@id]
return
  if ( $B-fileB )
  then $B-fileB
  else $B-fileA
}</A>

或者,您可以依赖支持XQuery Update的XQuery实现。 XQuery pattern with a kind of copy functionSaxon以及其他可能提供C ++语言绑定或实现。