请求的输出应如下所示:
<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 片段/文档,并指定 INDENT
或 NO 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
。