在 xmltype 中查找 xml 声明



我正在尝试编写一个谓词来查找包含 xml 声明的 xmltype 列

<?xml version="1.0" encoding="UTF-8"?>

到目前为止,我已经想出了:

where regexp_like(substr(XMLSERIALIZE(DOCUMENT my_xmltype_col AS CLOB),1,100),'<?xml version=')

即将 XMLTYPE 列的第一个 100 个字符转换为字符串,然后对该字符串进行regexp_like。这显然不是很快,我有一个大表要搜索。有人有更好的主意吗?

你不能用XML查询直接搜索XML声明,因为它对XPath是不可见的(我相信,无论如何(。不过,您正在做比您需要的更多的工作;不需要XMLSerialize调用,使用like会比regexp_like更快;但是当你在寻找一个固定的字符串时,你可以使用相等性检查,例如

select *
from your_table t
where dbms_lob.substr(t.my_xmltype_col.getclobval(), 5, 1) = '<?xml';

如果需要,您可以获取更多字符并比较更长的固定字符串,但这应该足以告诉您有一个声明。

如果你担心它在XML的开头不正确(这可能吗?(,那么你可以搜索它:

select *
from your_table t
where dbms_lob.instr(t.my_xmltype_col.getclobval(), '<?xml') > 0;

但是,由于当没有匹配项时,必须浏览整个文档,因此对于那些人来说可能会很慢;因此,如果您认为可以发生,则可以与dbms_lob.substr()相结合,并且可以相当自信地在开始时跳过很多内容,例如

select *
from your_table t
where dbms_lob.instr(dbms_lob.substr(t.my_xmltype_col.getclobval(), 100, 1), '<?xml') > 0;

最新更新