【问题标题】:The new line doesn't work when generating xml生成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

提前致谢!

标记

【问题讨论】:

    标签: plsql oracle10g


    【解决方案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 放在同一行中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2013-01-07
    • 1970-01-01
    • 2015-08-02
    • 2016-04-15
    相关资源
    最近更新 更多