如何防止SQL重新格式化XML

时间:2018-10-08 15:18:14

标签: sql oracle

更新了一个xml文件,以便使用以下命令删除不必要的字段 deletexml(xmltype(xxx)).getClobVal() 但是XML返回的是一个长字符串,而不是格式正确的带有缩进和空格的XML文件。知道我在做什么错吗?谢谢

3 个答案:

答案 0 :(得分:1)

从oracle 11.2开始不推荐使用

getClobVal和getStringVal。您必须使用xmlserialize来代替这些功能。

示例:

 select xmlserialize(document xmltype('<a><b><c>xxx</c></b></a>') indent size=2) from dual; 

然后您将以包含漂亮打印xml的clob对象结束。

答案 1 :(得分:0)

“带有缩进和空格的格式正确的XML文件”

这可能会让您感到惊讶,但是XML格式正确(格式正确)。 XML标准除了允许使用结构元素之间的空白外,什么都没有说。出于某种原因,它被称为“无关紧要的空白”。

如果要格式化XML以使其易于阅读,则必须自己执行。但是XML不适合人类,它适合机器,因此没有理由让您的SQL进行这种格式化。如果您想以人工检查XML,请使用喜欢的任何工具来自动格式化XML以提高可读性。

答案 2 :(得分:0)

我使用此过程制作漂亮的XML:

PROCEDURE MakePrettyXml(xmlString IN OUT NOCOPY CLOB) IS

    xmlDocFragment DBMS_XMLDOM.DOMDOCUMENTFRAGMENT;
    xslProc DBMS_XSLPROCESSOR.PROCESSOR;
    xsl DBMS_XSLPROCESSOR.STYLESHEET;
    xmlStringOut CLOB;

BEGIN

    DBMS_LOB.CREATETEMPORARY(xmlStringOut, TRUE);
    xslProc := DBMS_XSLPROCESSOR.NEWPROCESSOR; 
    xsl := DBMS_XSLPROCESSOR.NEWSTYLESHEET(
        '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'||
            '<xsl:output method="xml" indent="yes"/>'||
            '<xsl:template match="@*|node( )">'||
                '<xsl:copy>'||
                    '<xsl:apply-templates select="@*|node( )"/>'||
                '</xsl:copy>'||
            '</xsl:template>'||
        '</xsl:stylesheet>', NULL);

    xmlDocFragment := DBMS_XSLPROCESSOR.PROCESSXSL(p => xslProc, ss => xsl, cl => xmlString);
    DBMS_XMLDOM.WRITETOCLOB(DBMS_XMLDOM.MAKENODE(xmlDocFragment), xmlStringOut);

    DBMS_XSLPROCESSOR.FREESTYLESHEET(xsl);
    DBMS_XSLPROCESSOR.FREEPROCESSOR(xslProc);

    xmlString := xmlStringOut; 
    DBMS_LOB.FREETEMPORARY(xmlStringOut);

END MakePrettyXml;

但是请注意,输出是CLOB而不是XMLTYPE,您可能需要一些其他转换。