我有以下XML:
<per:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.something.com/2014/11/bla/webservice.xsd"
xmlns:per="http://www.something.com/2014/11/bla/person">
<per:Initials>E.C.</per:Initials>
<per:FirstName>Erik</per:FirstName>
<per:LastName>Flipsen</per:LastName>
<per:BirthDate>1980-07-01</per:BirthDate>
<per:Gender>Male</per:Gender>
</per:Person>
Run Code Online (Sandbox Code Playgroud)
从这个xml我想在PL/SQL中提取一些数据.我想使用XMLTABLE,因为不推荐使用EXTRACT和EXTRACTVALUE函数.
我可以使用此查询提取数据:
select pers.Initials,
pers.Firstname
into lsInitials,
lsFirstname
from
XMLTABLE ('*:Person' passing pxRequest
columns Initials PATH '*:Initials',
Firstname PATH '*:FirstName'
) pers;
Run Code Online (Sandbox Code Playgroud)
我正在使用通配符作为命名空间,因为我真的不关心发送方用于命名空间的缩写,我知道无论如何获取我的数据的确切路径.
有了这段代码,我有两件事让我困惑:
编辑:
我发现当我删除元素的命名空间并使它们大写时,它可以工作.因此,列名称似乎需要匹配xml元素名称才能使其工作.我还没弄明白如何使用命名空间XML.
可运行的代码示例:
SET SERVEROUTPUT ON;
DECLARE
pxRequest xmltype := xmltype('<per:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.something.com/2014/11/bla/webservice.xsd"
xmlns:per="http://www.something.com/2014/11/bla/person">
<per:Initials>E.C.</per:Initials>
<per:FirstName>Erik</per:FirstName>
<per:LastName>Flipsen</per:LastName>
<per:BirthDate>1980-01-01</per:BirthDate>
<per:Gender>Male</per:Gender>
</per:Person>');
lsInitials varchar2(100);
lsFirstname varchar2(100);
begin
select pers.Initials,
pers.Firstname
into lsInitials,
lsFirstname
from
XMLTABLE ('*:Person' passing pxRequest
columns Initials PATH '*:Initials', …Run Code Online (Sandbox Code Playgroud) 我试图从位于Oracle表的XMLTYPE列中的xml元素中提取值.我想要提取的xml元素具有为其定义命名空间的父元素.xml看起来像:
<a>
<b xmlns="urn:www.someSite.com/myModel">
<c>my value</c>
</b>
</a>
Run Code Online (Sandbox Code Playgroud)
如果我想提取"a"元素的内容,则正确返回其上下文:
SELECT Extract(myColumn, '/a') FROM myTable;
Run Code Online (Sandbox Code Playgroud)
但是为了返回"c"元素的内容,我没有成功找到任何版本.以下说明不起作用:
SELECT Extract(myColumn, '/a/b/c') FROM myTable;
SELECT Extract(myColumn, '/a/b/c', 'xmlns="urn:www.someSite.com/myModel"') FROM myTable;
SELECT Extract(myColumn, '/a/b/c', 'urn:www.someSite.com/myModel') FROM myTable;
Run Code Online (Sandbox Code Playgroud)
任何人都能帮助我,使用在这种情况下可行的提取语句吗?