Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止SQL中的XML重新格式化_Sql_Oracle - Fatal编程技术网

如何防止SQL中的XML重新格式化

如何防止SQL中的XML重新格式化,sql,oracle,Sql,Oracle,更新了xml文件,以便使用删除不必要的字段 deletexml(xmltype(xxx)).getClobVal() 但是XML作为一个长字符串返回,而不是带有缩进和空格的格式正确的XML文件。知道我做错了什么吗?谢谢“格式正确且带有缩进和空格的XML文件” 这可能会让您感到惊讶,但这是格式正确(格式良好)的XML。XML标准没有提到结构元素之间的空白,只是允许空白。它被称为“微不足道的空白”是有原因的 如果您想格式化XML以使其具有人类可读性,您必须自己动手。但是XML不适合人类,它适合机器,

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

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

这可能会让您感到惊讶,但这是格式正确(格式良好)的XML。XML标准没有提到结构元素之间的空白,只是允许空白。它被称为“微不足道的空白”是有原因的


如果您想格式化XML以使其具有人类可读性,您必须自己动手。但是XML不适合人类,它适合机器,所以没有理由让SQL进行这种格式化。如果您想将XML作为人来检查,请使用您喜欢的任何工具自动格式化XML以使其具有可读性。

getClobVal
,getStringVal自oracle 11.2以来一直被弃用。您必须使用
xmlserialize
来代替这些函数

例如:

 select xmlserialize(document xmltype('<a><b><c>xxx</c></b></a>') indent size=2) from dual; 
从dual中选择xmlserialize(文档xmltype('xxx')缩进大小=2);

您将以包含pretty print xml的clob对象结束。

我使用以下过程生成pretty 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;
过程MakePrettyXml(xmlString IN OUT NOCOPY CLOB)是
xmlDocFragment DBMS_XMLDOM.DOMDOCUMENTFRAGMENT;
xslProc DBMS_XSLPROCESSOR.PROCESSOR;
xsl DBMS_XSLPROCESSOR.STYLESHEET;
xmlStringOut-CLOB;
开始
DBMS_LOB.CREATETEMPORARY(xmlStringOut,TRUE);
xslProc:=DBMS_XSLPROCESSOR.NEWPROCESSOR;
xsl:=DBMS\u XSLPROCESSOR.NEWSTYLESHEET(
''||
''||
''||
''||
''||
''||
''||
'',无效);
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
,您可能需要一些额外的转换。

感谢您的回复!我只是不明白为什么这个简单的sql函数会改变xml的整个布局。对我可以用来保持xml人性化的工具有什么建议吗?嗯,数据库将解析您输入的任何内容,并以某种方式对数据进行内部表示。当它输出时,它将使用最有效的方式返回数据。在Stackoverflow上,要求使用工具是不合适的,但大多数常见的文本编辑器(如果您在Windows下,会想到notepad2、notepad++),甚至任何浏览器都可以“美化”XML。