如何在 Oracle 中从 XML 文档中提取关键 XML 元素?
问题陈述
你需要从 XML 文档中提取部分 / 子集元素值。
解决方案
我们可以利用支持 XMLTYPE 数据类型的 Oracle 的 EXTRACT 函数。EXTARCT 函数能够通过返回 XMLTYPE 值来保持 XML 元素名称和属性结构。
假设我们有 tmp_xml_gen 表中的以下 XML,我们要从中提取客户姓名。
示例
<?xml version="1.0"?> <customers> <customer> <customer_id>134</customer_id> <email>taylor.cauchon@internalmail</email> <name>Taylor Cauchon</name> <orders> <order> <order_id>921</order_id> <status>COMPLETE</status> </order> <order> <order_id>485</order_id> <status>COMPLETE</status> </order> <order> <order_id>1528</order_id> <status>COMPLETE</status> </order> <order> <order_id>1672</order_id> <status>COMPLETE</status> </order> <order> <order_id>1319</order_id> <status>COMPLETE</status> </order> </orders> </customer> </customers>
SQL: 从 XML 文档中提取客户姓名值
SELECT extract (result, '/customers/customer/customer_id').getclobval() FROM tmp_xml_gen ;
输出:SQL 语句中的行
<customer_id>134</customer_id> <customer_id>135</customer_id> <customer_id>136</customer_id> <customer_id>137</customer_id> <customer_id>138</customer_id> <customer_id>139</customer_id> <customer_id>140</customer_id> <customer_id>141</customer_id> <customer_id>142</customer_id> <customer_id>143</customer_id> <customer_id>144</customer_id> <customer_id>145</customer_id> <customer_id>146</customer_id> <customer_id>147</customer_id>
注意:EXTRACT 函数对 XML 的操作与其对其他数据类型使用的行为不同。当用于日期或时间时,EXTRACT 只会返回请求的日期或时间部分,例如月份。如果请求月份,EXTRACT 不会返回日期或时间或任何“较小”的度量,例如天、小时等。对 XMLTYPE 数据进行操作时,EXTRACT 将返回匹配元素的嵌套级别或更低级别上的所有内容。
我们还可以使用 XMLTABLE 来提取所需信息。
代码
WITH cust AS -- Customer details (SELECT xt.customer_id, xt.email, xt.name, x.result FROM tmp_xml_gen x, XMLTABLE('/customers/customer' PASSING x.RESULT COLUMNS customer_id VARCHAR2(10) PATH 'customer_id', email VARCHAR2(255) PATH 'email', name VARCHAR2(255) PATH 'name') xt), -- Order details ord AS (SELECT customer_id, email, name, xt2.* FROM cust t, XMLTABLE('//orders/order' PASSING t.result COLUMNS order_id VARCHAR2(4) PATH 'order_id', status VARCHAR2(10) PATH 'status' ) xt2) SELECT * FROM ord;
输出:上述 SQL 中的几行
134 taylor.cauchon@internalmail Taylor Cauchon 921 COMPLETE 134 taylor.cauchon@internalmail Taylor Cauchon 485 COMPLETE 134 taylor.cauchon@internalmail Taylor Cauchon 1528 COMPLETE 134 taylor.cauchon@internalmail Taylor Cauchon 1672 COMPLETE 134 taylor.cauchon@internalmail Taylor Cauchon 1319 COMPLETE 135 marc.domanski@internalmail Marc Domanski 50 COMPLETE 135 marc.domanski@internalmail Marc Domanski 99 COMPLETE 135 marc.domanski@internalmail Marc Domanski 142 COMPLETE 135 marc.domanski@internalmail Marc Domanski 195 COMPLETE
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP