Обновление XQuery заменить в Sedna - PullRequest
1 голос
/ 13 августа 2011

Я работаю над небольшим проектом для школы.Этот проект просит меня показать, что я способен использовать различные методы обработки XML.Теперь в моем проекте я работаю с менеджером баз данных Sedna, в котором я храню пользовательские записи, и я хотел бы обновить некоторые из этих пользовательских записей через XQuery (я использую PHP API для отправки запросов к базе данных через PHP Api, предоставленныйкоманда разработчиков Sedna).Представьте, что у меня есть следующее содержимое базы данных для записей пользователей:

<?xml version="1.0" encoding="UTF-8"?>

<users>
    <user id="admin" admin="true">
        <email>admin@admin.com</email>
        <password>123456789</password>
        <firstname>The</firstname>
        <lastname>Stig</lastname>
        <gender>male</gender>
        <subscriptions>
        </subscriptions>
    </user>
    <user id="prosper" admin="false">
        <email>prosper@localhost.com</email>
        <password>123456789</password>
        <firstname>Strange</firstname>
        <lastname>Figure</lastname>
        <gender>male</gender>
        <subscriptions>
        </subscriptions>
    </user>
</users>

Теперь я собираюсь обновить, например, запись пользователя prosper.В этой записи я хотел бы, например, изменить свое имя и адрес электронной почты, но оставив остальные без изменений.Я попытался использовать следующий запрос, но после отправки запроса он меняет порядок документа пользовательской записи по какой-то причине, которую я не понимаю (я думаю, что он вставляет узлы атрибутов пользовательской записи как дочерние узлы).Это запрос, который я использую для обновления пользователя:

UPDATE replace $user in doc("users")//user[@id="prosper"]
with
<user>{($user/@*)}
<email>strange.figure@localhost.com</email>
{($user/node()[password])}
<firstname>Familiar</firstname>
<lastname>Figure</lastname>
<gender>male</gender>
{($user/node()[subscriptions])}</user>

Теперь проблема, которую вызывает этот запрос, заключается в том, что когда я пытаюсь запросить информацию о пользователе после обновления, я полагаюсь на тот же порядокДочерние узлы есть до обновления, но этот запрос меняет порядок.

Есть ли кто-то достаточно опытный, чтобы помочь мне с этой проблемой?

Я благодарю вас за ваше время.

1 Ответ

0 голосов
/ 16 августа 2011

Ян, если вы хотите получить password узел, вы должны изменить свой XPath (ваше текущее выражение {($user/node()[password])} не то, что вы думаете):

{$user/password}

то же самое для subscriptions

{$user/subscriptions}

Может быть записано как одно выражение с предикатом:

{$user/node()[local-name(.) = ('password', 'subscriptions')]}
...