从具有 Oracle db 中的属性的 XML 中提取 NCLOB 中的 XML 数据
Posted
技术标签:
【中文标题】从具有 Oracle db 中的属性的 XML 中提取 NCLOB 中的 XML 数据【英文标题】:Extracting XML data from NCLOB from XML with attributes in Oracle db 【发布时间】:2015-05-17 04:02:57 【问题描述】:我正在尝试从存储为 Oracle db 表中 NCLOB 列的 XML 数据中提取值。
xml结构
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://example.com/FAS/DOC/2011/v3.0b" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<record xmlns="http://example.com/FAS/DOC/2011/v3.0b">
<pdate xmlns="http://example.com/FAS/DOC/2011/v3.0b">2014-05-15</pdate>
</record>
</root>
查询
select EXTRACTVALUE(XMLTYPE(nclob_column),'/root/record/pdate','xmlns="http://example.com/FAS/DOC/2011/v3.0b"') pdate1,
EXTRACTVALUE(XMLTYPE(nclob_column),'/root/record/pdate') pdate2
from nclob_table
问题
pdate1
确实返回值,但pdate2
返回 null。一世 不能使用 EXTRACTVALUE() 的第三个参数来指定 xmlns 属性值,因为它在每一行/记录上都会发生变化。所以我得到 一行的值,但所有其他行的值为 null。
如何在不指定属性的情况下提取值?
谢谢。
【问题讨论】:
【参考方案1】:如果您可以保证命名空间在这种情况下对选择元素无关紧要,则可以使用local-name()
仅通过元素的本地名称匹配元素,忽略命名空间:
select EXTRACTVALUE(
XMLTYPE(nclob_column),
'/*[local-name()="root"]/*[local-name()="record"]/*[local-name()="pdate"]'
) pdate
from nclob_table
SQL Fiddle
【讨论】:
以上是关于从具有 Oracle db 中的属性的 XML 中提取 NCLOB 中的 XML 数据的主要内容,如果未能解决你的问题,请参考以下文章
如何跟踪存储在 Oracle Berkeley DB XML 中的文件的更改
使用 Oracle 数据库中的 SQL 从 XML Clob 中提取数据
从 Clob 列中提取 XML 标记值,在 Oracle 中具有多个具有相同名称的标记