如何使用XQuery更新BaseX XML数据库中的属性?

时间:2014-11-16 00:42:11

标签: xquery basex xquery-update

我使用BaseX以多种item节点存储XML数据,格式如下:

<root>
  <item id="Root" parent_id="0" type="folder">
    <content>
      <name>Root</name>
    </content>
  </item>

  <item id="One" parent_id="Root" type="file">
    <content>
      <name>First File in the Tree</name>
    </content>
  </item>

  <item id="Two" parent_id="Root" type="file">
    <content>
      <name>Second File in the Tree</name>
    </content>
  </item>
</root>

我正在尝试将其中一个'item'节点上的parent_id更新为另一个item节点的id属性。

运行XQuery表达式之前的树:

  

Root
  the树中的第一个文件
  ∟树中的第二个文件

我正在尝试找出正确的XQuery表达式,将item之一的父级从root更改为“一个”item,这样我的树现在看起来像这样:

预期结果树:

  

Root
  the树中的第一个文件
  ∟树中的第二个文件

由于属性parent_id控制了这一点,我希望准确更新。

1 个答案:

答案 0 :(得分:2)

如果您只想更新@parent_id属性,请使用简单的更新查询,例如

  replace value of node //item[@id='Two']/@parent_id with 'One'

但是:这实际上不会改变 XML树,而只会改变你在中表示的那个(虽然我相信这就是你的问题所在关于)。存储树的类似XML的方法是直接将您想要的树映射到XML:

<root>
  <item id="Root" type="folder">
    <content>
      <name>Root</name>
    </content>
    <item id="One" type="file">
      <content>
        <name>First File in the Tree</name>
      </content>
      <item id="Two" type="file">
        <content>
          <name>Second File in the Tree</name>
        </content>
      </item>
    </item>
  </item>
</root>

或者更简洁,持有相同的信息:

<folder id="Root" name="Root">
  <file id="One" name="First File in the Tree">
    <file id="Two" name="Second File in the Tree" />
  </file>
</folder>
相关问题