gpt4 book ai didi

xml - 如何在 Oracle 中查询带有命名空间的 XML?

转载 作者:数据小太阳 更新时间:2023-10-29 02:06:05 24 4
gpt4 key购买 nike

我需要从包含完整 XML 文档的 XMLType 变量中提取 PLSQL 过程中的数据,具有以下结构(下面已简化):

<?xml version="1.0" encoding="utf-8"?>
<AA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://my.domain/cat1/">
<Element>
<ID>2</ID>
<Value>46544</Value>
<Element>
</AA>

我正在使用 XMLTable 函数,但是使用简单的 /AA/Element XPath 表达式没有得到任何数据:

SELECT C1, C2
INTO v_id, v_val
FROM XMLTable('/AA/Element'
passing v_MyXML columns
C1 number path 'ID',
C2 number path 'Value'
)

都不是以下任何表达式:

'/*.AA/Element'
'declare default element namespace "http://my.domain/cat1/"; /AA/Element'
'declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance"; declare namespace xsd="http://www.w3.org/2001/XMLSchema"; declare default element namespace "http://jpk.mf.gov.pl/wzor/2016/03/09/03094/"; /AA/Element'

我能够提取数据的唯一方法是修改文档/变量并简单地替换

<AA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://my.domain/cat1/">

<AA>

这不是完美的解决方案,因为我需要修改文档并返回其具有适当属性的初始结构。有人可以建议如何修改 XPath 表达式以便能够获取数据吗?或者可以使用任何其他方法忽略 AA 元素的命名空间?

最佳答案

@JensErat 已经提供了 XML 背景,所以我不必再提供了。相反,您会在下面找到一个工作示例,了解如何在 Oracle PL/SQL 中应用所有这些内容。

您需要使用 xmltableXML 命名空间子句 :

The XMLNAMESPACES clause contains a set of XML namespace declarations. These declarations are referenced by the XQuery expression (the evaluated XQuery_string), which computes the row, and by the XPath expression in the PATH clause of XML_table_column, which computes the columns for the entire XMLTable function. If you want to use qualified names in the PATH expressions of the COLUMNS clause, then you need to specify the XMLNAMESPACES clause.

您还可以使用默认 XML 命名空间子句:

xmlnamespaces(default 'http://my.domain/cat1/')

那么你就不必使用命名空间前缀了。

没有默认命名空间的示例

declare
v_xml constant xmltype := xmltype('<AA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://my.domain/cat1/">
<Element>
<ID>2</ID>
<Value>46544</Value>
</Element>
</AA>'
);
v_id number;
v_value number;
begin
select id, value_
into v_id, v_value
from xmltable(
xmlnamespaces('http://my.domain/cat1/' as "foo"),
'/foo:AA/foo:Element' passing v_xml
columns
id number path 'foo:ID',
value_ number path 'foo:Value'
);

dbms_output.put_line('(v_id = ' || v_id || ')(v_value = ' || v_value || ')');
end;
/

默认命名空间示例

declare
v_xml constant xmltype := xmltype('<AA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://my.domain/cat1/">
<Element>
<ID>2</ID>
<Value>46544</Value>
</Element>
</AA>'
);
v_id number;
v_value number;
begin
select id, value_
into v_id, v_value
from xmltable(
xmlnamespaces(default 'http://my.domain/cat1/'),
'/AA/Element' passing v_xml
columns
id number path 'ID',
value_ number path 'Value'
);

dbms_output.put_line('(v_id = ' || v_id || ')(v_value = ' || v_value || ')');
end;
/

示例运行:

SQL> @so58
(v_id = 2)(v_value = 46544)

PL/SQL procedure successfully completed.

SQL>

关于xml - 如何在 Oracle 中查询带有命名空间的 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38439595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com