更新了一个xml文件,以便使用以下命令删除不必要的字段
deletexml(xmltype(xxx)).getClobVal()
但是XML返回的是一个长字符串,而不是格式正确的带有缩进和空格的XML文件。知道我在做什么错吗?谢谢
答案 0 :(得分:1)
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
,您可能需要一些其他转换。