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 属性与命名空间的主要内容,如果未能解决你的问题,请参考以下文章