我正在为学校做一个小项目。这个项目要求我展示我能够使用各种XML处理技术。现在,在我的项目中,我使用Sedna数据库管理器,我在其中保存用户记录,我想通过XQuery更新其中的一些用户记录(我使用PHP API通过Sedna开发团队提供的PHP API向数据库发送查询)。假设我有以下用户记录的数据库内容:
<?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的用户记录。在这个记录中,我想,例如,改变他的名字和电子邮件,但保持其他不变。我尝试过使用下面的查询,但是在发送查询之后,由于一些我不理解的原因,它改变了userrecord的文档顺序(我认为它将用户记录的属性节点插入为子节点)。这是我用来更新用户的查询:
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>
现在,这个查询给我的问题是,当我在更新后尝试询问用户的信息时,我依赖于更新前的子节点的相同顺序,但是这个查询改变了顺序。
有足够熟练的人来帮我解决这个问题吗?
感谢您的宝贵时间。
Jan,如果您想获得password
节点,您应该更改您的XPath(您当前的表达式{($user/node()[password])}
不是您所想的):
{$user/password}
同样适用于subscriptions
:
{$user/subscriptions}
可以写成一个带有谓词的表达式:
{$user/node()[local-name(.) = ('password', 'subscriptions')]}