如何在Oracle DB中禁用XML DTD验证?

时间:2009-03-12 09:06:44

标签: xml database oracle validation dtd

我在查询的选择部分使用以下语句:

extract(XMLTYPE(doc.payload),'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')

如果doc.payload包含XML没有DTD声明,则效果很好,但是当Oracle尝试验证文档但找不到DTD声明时会引发错误DTD

如何禁用此查询的XML验证?我不想在这个问题上影响我的会话设置或全局系统设置。

1 个答案:

答案 0 :(得分:4)

您可以在创建XMLTYPE时关闭验证,构造函数签名如下所示:

XMLType(
   xmlData IN varchar2,
   schema IN varchar2 := NULL,
   validated IN number := 0,
   wellformed IN number := 0)

所以你可以禁用这样的验证:

   extract(XMLTYPE(doc.payload, NULL, 1, 1),
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')

如果您有外部DTD参考,这对您没有帮助。它仍然试图加载它。是否无法将DTD文件上传到XMLDB存储库?那将是最简单的解决方案。如果没有,没有'好'的解决方案,你必须在创建XMLTYPE之前删除DTD引用:

   extract(XMLTYPE(REGEXP_REPLACE(doc.payload, '<!DOCTYPE[^<]*>', '')),
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')