【问题标题】:How to disable XML DTD validation in Oracle DB?如何在 Oracle DB 中禁用 XML DTD 验证?
【发布时间】:2009-03-12 09:06:43
【问题描述】:

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

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

如果doc.payload 包含XML 而没有DTD 声明,它会很好地工作,但是当Oracle 尝试验证文档但找不到DTD 时出现DTD 声明时会引发错误。

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

【问题讨论】:

    标签: xml database oracle validation dtd


    【解决方案1】:

    创建 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')
    

    【讨论】:

    • 我使用的 XML 中的引用是本地的,我目前在家,但是一旦我回来工作,我一定会检查一下 :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 2011-06-14
    • 2010-11-22
    • 2011-11-17
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多