Я пытался заменить один элемент (и его подэлементы) с содержимым из другого файла 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
Это не поддерживается в xtpatterns Qt. Я пробовал разные версии кода выше, но без удачи. Я уже использую XQuery для получения частей файлов XML, но я не нашел решения, как это сделать.
Может быть, инструменты Qt не поддерживают это? Я не могу найти на страницах Qt ничего о том, как сделать что-то подобное (xmlprocessing).
Обновление XQuery является дополнением к XQuery. Из чего Документация по Qt 5 XQuery описывает, XQuery Update не поддерживается.
Поскольку не поддерживается изменение элементов без XQuery Update, вам придется реконструировать все дерево, применяя некоторые модификации. Для общего использования это может быть достигнуто с помощью общего XQuery шаблон с видом copy
функция, но для довольно простой структуры без вложенных элементов вы можете сделать проще без функции, жестко закодировав структуру.
<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 с поддержкой XQuery Update. И то и другое саксонский, Basex и, возможно, другие предоставляют привязки или реализации языка C ++.
Других решений пока нет …