如何防止SQL中的XML重新格式化
更新了xml文件,以便使用删除不必要的字段如何防止SQL中的XML重新格式化,sql,oracle,Sql,Oracle,更新了xml文件,以便使用删除不必要的字段 deletexml(xmltype(xxx)).getClobVal() 但是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。