三 如何解析XML内容:
1、XPath结构介绍:
/ 表示树根。例如:/PO 指向树根的子节点<PO>; 通常也作为路径分隔符使用,例如:/A/B
// 表示当前节点下所有子节点;例如:/A//B 匹配A节点下所有B节点
* 作为通配符使用,匹配所有子节点; 如:/A/*/C 匹配A节点下所有子节点C
[ ] 表示预期表达式;XPath支持丰富的操作符如OR、AND、NOT等;例如:/PO[PONO=20 AND PNAME="PO_2"]/SHIPADDR 匹配所有订单号为20并且订单名为PO_2的送货地址
@ 用来提取节点属性
FunctionsXPath支持一些内置函数如:substring(), round() 和 not().
2、使用XMLTYPE方法查询XML:
SELECT x.OBJECT_VALUE.getCLOBVal() FROM xml_table x;
SELECT x.OBJECT_VALUE.getSTRINGVal() FROM xml_table x;
3、使用函数解析XML:
--existsNode 判断XPath中节点是否存在,存在返回值1 不存在返回0;
SELECT existsNode(OBJECT_VALUE, '/PurchaseOrder/Reference')
FROM purchaseorder;
--extractValue 提取XPath节点值
SELECT extractValue(OBJECT_VALUE, '/PurchaseOrder/Reference')
FROM purchaseorder
WHERE existsNode(OBJECT_VALUE, '/PurchaseOrder/Reference') = 1;
--extract 提取XPath节点
SELECT extract(OBJECT_VALUE, '/PurchaseOrder/Reference') "REFERENCE"
FROM purchaseorder;
4、使用SQL解析XML:
SELECT extractValue(OBJECT_VALUE, '/PurchaseOrder/Reference') REFERENCE,
extractValue(OBJECT_VALUE, '/PurchaseOrder/*//User') USERID,
CASE
WHEN existsNode(OBJECT_VALUE, '/PurchaseOrder/Reject') = 1
THEN 'Rejected'
ELSE 'Accepted'
END "STATUS",
extractValue(OBJECT_VALUE, '//CostCenter') CostCenter
FROM purchaseorder
WHERE existsNode(OBJECT_VALUE,'//Reject') = 1;