我正在尝试使用Python和Oracle XML DB。我有一个表,其中包含XMLType列和Oracle 11g数据库中的ID列。 XML列的存储模型是对象关系。有时我需要获得一个完整的XML文件,并且通常它超过4000个字符,所以我使用此查询来获取CLOB:
select t.representation.getclobval()
from myxmldocs t
where id=:documentId
当我运行此查询时,输出包含额外的空格,XML元素之间的换行符和制表符在我插入的XML文档中绝对不存在。效果是某种格式化,因此输出如下所示:
<A>\n
\t<B></B>\n
\t\t<C>Some text</C>\n
\t\t<C>Some more text</C>\n
\t<B></B>\n
...
等等。相当漂亮和可读,但为什么我得到它?它还混淆了我正在使用的额外空格上的其他库。
如果我删除getclobval(),我的Python客户端不会获得CLOB而是一个Object,我不知道如何处理它。
这似乎是一致的;我使用sqlplus命令行客户端,并使用不同的XML架构创建其他表,然后查询它们。在我的原型的先前版本中,我使用XMLType列使用CLOB存储模型并且没有此问题。
我应该如何重写查询以获取带有XML文件的CLOB而不需要额外的格式化?
更新:根据评论中的要求,这是我从命令行客户端运行查询select dump(t.representation) from myxmldocs t where id=:documentId
的输出(替换当然:documentId与数据库中的实际现有ID):
DUMP(T.REPRESENTATION)
--------------------------------------------------------------------------------
Typ=58 Len=218: 32,156,148,1,0,0,0,0,80,193,223,20,0,0,0,0,216,15,47,21,0,0,0,0,
80,44,55,21,0,0,0,0,0,202,154,59,160,15,0,0,160,15,0,0,1,0,4,0,220,190,195,71,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,174,33,65,0,15,0,72,0,1,0,0,0,0,0,0,0,49,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0
答案 0 :(得分:6)
在11g中你可以使用xmlserialize
(事实上你不应该再使用getclobval
。出于性能原因不推荐使用它。)
SQL> select t.test.getclobval() from testxml t where id = 1;
T.TEST.GETCLOBVAL()
--------------------------------------------------------------------------------
<A>
<B>
<C>foo</C>
<C>foo2</C>
</B>
</A>
SQL> select xmlserialize(document t.test as clob no indent) from testxml t where id = 1;
XMLSERIALIZE(DOCUMENTT.TESTASCLOBNOINDENT)
--------------------------------------------------------------------------------
<A><B><C>foo</C><C>foo2</C></B></A>
答案 1 :(得分:0)
getClobVal()
方法不应修改数据缩进。您的XML可能在插入期间或之前已格式化。
您可以transform XMLType删除空格:
SQL> SELECT XMLTYPE.createxml(
2 '<a>
3 <b><c></c></b>
4 </a>'
5 ).transform(XMLTYPE(
6 '<?xml version="1.0"?>
7 <xsl:stylesheet version="1.0"
8 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
9 <xsl:output method="xml" indent="no"/>
10 <xsl:strip-space elements="*"/>
11 <xsl:template match="@*|node()">
12 <xsl:copy>
13 <xsl:apply-templates select="@*|node()"/>
14 </xsl:copy>
15 </xsl:template>
16 </xsl:stylesheet>
17 ')).getClobVal() FROM dual;
<?xml version="1.0" encoding="utf-8"?>
<a><b><c></c></b></a>