1

我正在试验 Python 和 Oracle XML DB。我在 Oracle 11g 数据库中有一个包含 XMLType 列和 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 而是一个对象,我不知道如何处理它。

这似乎是一致的;我使用 sqlplus 命令行客户端遇到了这个问题,并且还使用不同的 XML 模式创建了其他表,然后查询它们。在我的原型的早期版本中,我的 XMLType 列使用了 CLOB 存储模型并且没有这个问题。

我应该如何重写查询以获取带有 XML 文件的 CLOB 而无需额外的格式?


更新:根据评论中的要求,这是我select dump(t.representation) from myxmldocs t where id=:documentId从命令行客户端运行查询得到的输出(当然,用数据库中的实际现有 ID 替换 :documentId):

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
4

2 回答 2

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>
于 2013-03-18T12:08:38.133 回答
0

getClobVal()方法不应修改数据的缩进。您的 XML 可能在插入期间或之前已格式化。

您可以转换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>
于 2013-03-18T12:07:08.047 回答