生成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时新行不起作用的主要内容,如果未能解决你的问题,请参考以下文章

yii2 pdf生成不起作用

引导表单组行不起作用

UIPickerView 选择行不起作用 ios7

控制台写行不起作用

Pandas 用 df.drop 删除行不起作用

没有 laravel 的 Eloquent 选择行不起作用