如何在Oracle数据库中禁用XML DTD验证?
我在查询的select部分使用以下语句:如何在Oracle数据库中禁用XML DTD验证?,xml,database,oracle,validation,dtd,Xml,Database,Oracle,Validation,Dtd,我在查询的select部分使用以下语句: extract(XMLTYPE(doc.payload),'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID') 如果doc.payload包含XML而没有DTD声明,但当Oracle试图验证文档但找不到DTD时,如果出现DTD声明,则会出现错误,这会很好地工作 如何禁用此查询的XML验证?我不想在这件事上影响我的会话设置或全局系统设置。您
extract(XMLTYPE(doc.payload),'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')
如果doc.payload
包含XML
而没有DTD
声明,但当Oracle试图验证文档但找不到DTD
时,如果出现DTD
声明,则会出现错误,这会很好地工作
如何禁用此查询的
XML
验证?我不想在这件事上影响我的会话设置或全局系统设置。您可以在创建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')
extract(XMLTYPE(REGEXP_REPLACE(doc.payload,'我使用的XML中的引用是本地的,我现在在家,但一旦我回来工作,我肯定会检查一下:)谢谢!