如何解决生成 xml
假设有一张桌子
create table mytable
(val1 number(5),val2 varchar2(10));
insert into mytable values (1,'XXX');
并要求生成以下 XML
<ns1:head>
<ns1:val1>1</val1>
<ns1:val2>XXX</val2>
</ns1:head>
运行起来很简单
select xmlelement("head",xmlelement("val1",val1).extract('/*'),xmlelement("val2",val2).extract('/*')
).extract('/*')
from mytable;
并得到
<head>
<val1>1</val1>
<val2>XXX</val2>
</head>
问题是,如果我尝试这样做,但是为了让每个节点在每个标签前都带有“ns1:”
select xmlelement("ns1:head",xmlelement("ns1:val1",xmlelement("ns1:val2",val2).extract('/*')
).extract('/*')
from mytable;
我得到一个 ORA-31011:XML 解析失败
也许我不知道 .extract('/*') 究竟是如何工作的,在我的情况下,“ns1:”可能会失败
Oracle 10g 版
提前致谢!
标记
解决方法
使用 extract('/*')
的目的是什么?
还必须定义命名空间前缀。您可以使用 xmlattributes
在根元素中添加其声明。
select xmlelement("ns1:head",xmlattributes('http://www.example.com/ns1' as "xmlns:ns1"),xmlelement("ns1:val1",val1),xmlelement("ns1:val2",val2)
)
from mytable;
结果:
<ns1:head xmlns:ns1="http://www.example.com/ns1"><ns1:val1>1</ns1:val1><ns1:val2>XXX</ns1:val2></ns1:head>
更新:
XMLELEMENT
返回和 XML 对象。如果要将其作为格式化文本获取,可以使用 XMLSERIALIZE
。
select XMLSERIALIZE(document xmlelement("ns1:head",val2)
) indent)
from mytable;
结果:
<ns1:head xmlns:ns1="http://www.example.com/ns1">
<ns1:val1>1</ns1:val1>
<ns1:val2>XXX</ns1:val2>
</ns1:head>
更新 2:
据我所知,indent
指令在 Oracle 10g 中不存在。因此,如果 extract('/*')
在没有命名空间的情况下工作,那么将 xmlattributes
添加到具有命名空间的原始查询可能会起作用。我没有 Oracle 10g 来测试这个。
select xmlelement("ns1:head",val1).extract('/*'),val2).extract('/*')
).extract('/*')
from mytable;
更新 3:
使用 extract('/*')
缩进行看起来像是一个未记录的功能。在 Oracle 12c 上,它不能以这种方式工作。因此,更新 Oracle 版本可能会破坏这种未记录的行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。