Oracle Sql 属性与命名空间

Posted

技术标签:

【中文标题】Oracle Sql 属性与命名空间【英文标题】:Oracle Sql to attribute with namespace 【发布时间】:2020-09-15 16:34:27 【问题描述】:

我正在尝试使用 Oracle sql 语句将属性添加到 xml。 XML 作为数据存储在表“项目”的列中。我没有问题添加一个新的 'id' 属性,其值为 '123',如下面的查询所示。

UPDATE item SET item_xml = INSERTCHILDXML(item_xml , '/item','@id', '123') where customer_id = '1';

但是,如果我添加 xml 命名空间而不是常规的 'id' 属性,如果我想在 xml 下面附加命名空间(如 'xml:id')会抛出错误'无效的 XPATH 表达式',请告诉我有什么方法可以避免抛出这个错误

UPDATE item SET item_xml = INSERTCHILDXML(item_xml , '/item','@xml:id', '123') where customer_id = '1';

我知道我们在普通情况下不使用命名空间,但是我给出了“id”属性作为示例,因为我们的应用程序生成的 xml 在其他系统中使用,该系统需要为少数属性提供命名空间的属性。

更新 xml 后应该如下所示,请假设属性 'xml:id="123"' 最初不存在于表 'item' 的 xml clob 中。

<items>
  <item xml:id="123">Apple</item>
<items>

【问题讨论】:

您是在尝试添加具有该 ID 的新项目(在这种情况下,“Apple”来自哪里?),还是将属性添加到现有项目?包括该客户的起始 XML 可能会有所帮助。根据您的结果,您的第一次更新实际上不会做任何事情。 我将“id”属性添加到现有 xml 到“item”元素。 “Apple”是元素“item”的值。所以 xpath 将是“/items/item”。第一个查询将在正确的 xpath 之后工作,即 '/items/item' 但是,一旦您添加命名空间 '@xml:id' 查询将开始抛出错误,这是真正的问题,我需要解决它。如果 xpath 不正确,则不会设置该属性,但不会给出“无效的 XPATH 表达式”。 哦...你真的还在使用 Oracle 10g 吗? 【参考方案1】:

我认为不支持。

您可以使用modify XPath 来执行此操作;具有命名空间声明出现在属性中的副作用,即使它已经在文档中声明;希望不会涉及您的下游系统:

UPDATE item SET item_xml = XMLQuery('
  copy $n := .
  modify (  
    for $i in $n/items/item[$item][not(@xml:id)]
      return insert node attribute xml:id $id into $i
    )
  return $n'
  passing item_xml, 'Apple' as "item", 123 as "id"
  returning content
)
where customer_id = 1;
ITEM_XML
----------------------------------------------------------------------------------
<items>
  <item xml:id="123" xmlns:xml="http://www.w3.org/XML/1998/namespace">Apple</item>
</items>

db<>fiddle

我已经将项目值和 ID 值作为参数传递,而不是在 XPath 中硬编码它们;根据链接这些内容的位置和方式,您也许可以对所有行进行一次更新,从另一个表中获取项目/ID 映射。

这适用于更高版本的 Oracle e.g. 18c,我相信应该从 11.2.0.3 开始工作。但它在早期版本中不起作用,所以如果你真的在 10g 上,那么它需要一种不同的方法。

【讨论】:

非常感谢 Alex,有什么方法可以阻止添加属性 xmlns:xml="w3.org/XML/1998/namespace"。我看到它与 xml:id 属性一起添加。我是否必须再执行一个查询才能删除它多余的“xmlns:xml”属性?或者它可以被压制,如果有的话? 我看不到,它是在内部添加的,并且看起来无法控制。我想,您可以使用 replace() 从最终的 XML/CLOB 中删除它,但这有点麻烦。 谢谢亚历克斯!!

以上是关于Oracle Sql 属性与命名空间的主要内容,如果未能解决你的问题,请参考以下文章

如何列出 Oracle DB 中的所有上下文命名空间?

类命名空间与对象实例的命名空间 and 面向对象的组合用法

类命名空间与对象实例的命名空间和下面向对象的组合用法

oracle表空间简单学习

与数据库操作操作相关的命名空间都有哪些?

SaxonJS 发出多余的命名空间属性