生成xml时新行不起作用
Posted
技术标签:
【中文标题】生成xml时新行不起作用【英文标题】:The new line doesn't work when generating xml 【发布时间】:2021-05-03 10:17:23 【问题描述】:假设有桌子
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",val1).extract('/*'),
xmlelement("ns1:val2",val2).extract('/*')
).extract('/*')
from mytable;
我收到 ORA-31011:XML 解析失败
也许我不知道 .extract('/*') 究竟是如何工作的,在我的情况下,“ns1:”可能会失败
Oracle 版本 10g
提前致谢!
标记
【问题讨论】:
【参考方案1】:使用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", xmlattributes('http://www.example.com/ns1' as "xmlns:ns1"),
xmlelement("ns1:val1",val1),
xmlelement("ns1:val2",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", xmlattributes('http://www.example.com/ns1' as "xmlns:ns1"),
xmlelement("ns1:val1",val1).extract('/*'),
xmlelement("ns1:val2",val2).extract('/*')
).extract('/*')
from mytable;
更新 3:
使用extract('/*')
缩进行看起来像是一个未记录的功能。在 Oracle 12c 上,它不能以这种方式工作。因此,更新 Oracle 版本可能会破坏这种未记录的行为。
【讨论】:
我想将每个标签/节点放在一个新行中,而不是将所有 XML 放在同一行中以上是关于生成xml时新行不起作用的主要内容,如果未能解决你的问题,请参考以下文章