如何在Oracle PLSQL中获取自闭合xml标签



请求的输出应如下所示:

<Consignment id="123" date="2017-06-08">
    <Box id="321" />
</Consignment>

其中<box>标签应如上所述自闭合。

我正在使用以下代码:

SELECT XMLELEMENT( "Consignment", XMLATTRIBUTES('123' AS "id",sysdate AS "date" ),
            XMLELEMENT( "Box", xmlattributes( '321' as "id" ))     
                 ).getstringval() as xxx FROM DUAL;

但它始终返回以下结果(其中标签<box>具有单独的结束标签</box>(:

<Consignment id="123" date="2017-06-08">
    <Box id="321"></Box>
</Consignment>

如何让上述<box>标签自闭?

如果你只需要用"box"来做这件事,那么你可以使用:

SELECT REPLACE(XMLELEMENT( "Consignment", XMLATTRIBUTES('123' AS "id",sysdate AS "date" ),
            XMLELEMENT( "Box", xmlattributes( '321' as "id" ))     
                 ).getstringval(),'></Box>',' />') as xxx FROM DUAL;

如果您有其他标签需要以这种方式处理,则需要使用相同的逻辑使用 REGEXP_REPLACE。

但是,从语义上讲,这两种形式都表示完全相同的数据,这就是为什么你不能用给XML生成器的一些参数"轻松"做你想做的事情(以及为什么你可能一开始就不应该这样做!(。

如果通过 XMLSerialize() 函数传递生成的 XML 片段/文档,并指定 INDENTNO INDENT ,则空标记将转换为自闭合。(不指定两者都不会受到影响(。

SELECT XMLSerialize(CONTENT
    XMLELEMENT( "Consignment", XMLATTRIBUTES('123' AS "id",sysdate AS "date" ),
      XMLELEMENT( "Box", xmlattributes( '321' as "id" ))
  ) as VARCHAR2(4000) INDENT) as xxx FROM DUAL;
XXX                                                                             
--------------------------------------------------------------------------------
<Consignment id="123" date="2017-06-08">
  <Box id="321"/>
</Consignment>

或不格式化:

SELECT XMLSerialize(CONTENT
    XMLELEMENT( "Consignment", XMLATTRIBUTES('123' AS "id",sysdate AS "date" ),
      XMLELEMENT( "Box", xmlattributes( '321' as "id" ))
  ) as VARCHAR2(4000) NO INDENT) as xxx FROM DUAL;
XXX                                                                             
--------------------------------------------------------------------------------
<Consignment id="123" date="2017-06-08"><Box id="321"/></Consignment>

您的问题将输出显示为缩进,但您提供的代码不会缩进它,因此不确定您真正想要哪个。

我已经根据您对getStringVal的使用对数据类型使用了VARCHAR2,如果您知道大小,您可以将其缩小 - 或者如果您不知道,或者知道它可能太大而无法VARCHAR2,则可以将其更改为CLOB

最新更新