1

请求的输出应如下所示:

<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>标签自动关闭?

4

2 回答 2

2

如果您通过函数传递您生成的 XML 片段/文档XMLSerialize()并指定其中一个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>

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

我已经VARCHAR2根据getStringValCLOBVARCHAR2.

于 2017-06-08T16:08:32.597 回答
2

如果您只需要使用“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 生成器提供的某些参数“轻松”地做您想做的事情(以及为什么您一开始就不应该这样做!) .

于 2017-06-08T15:48:02.607 回答