我正在为我们的Oracle系统使用基于XML的审计。每个表上都有触发器来创建正在插入或更新到我们数据库中的单个审计表中的记录的XML表示。捕获审计数据正常工作,但是我在使用Oracle的XML解析实用程序提取信息时遇到了问题。
使用Gender表作为示例,审计表有一个XML列,如下所示:
<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<GENDER_ID>2</GENDER_ID>
<GENDER>Male</GENDER>
<GENDER_CODE>M</GENDER_CODE>
<LAST_MODIFIED_BY_USER>bob.smith</LAST_MODIFIED_BY_USER>
<LAST_MODIFIED_BY_DATE>08-JUN-13</LAST_MODIFIED_BY_DATE>
</ROW>
</ROWSET>
我希望能够将XML解析为两种格式之一。
使用以下脚本,我可以提取每个属性的值:
select extractValue(n.column_value, '/*') as Value
from (
select extract(XMLType(at.xml), '//ROWSET/ROW') as data from audit_table at
where at.audit_id = 1
) x,
TABLE (xmlSequence(extract(x.data,'/ROW/*'))) n
这会产生5行,其中包含一个“值”列:
这些值本身几乎没用,我无法弄清楚如何将属性名称与值相关联。有没有办法让属性名称(即GENDER_ID或GENDER_CODE)位于相关列中?
如果你知道XML的元素是什么,那么有很多解析XML的例子。在我们的例子中,审计表将为Gender(包含5列)保留XML,为其他具有各种列名和数字的表保存XML。
我可以想象,由于可以提取列值,因此属性名称肯定也可以,但我无法弄明白。
提前致谢, 添
答案 0 :(得分:2)
您可以使用getrootelement()函数获取属性名称。一个例子,
SELECT EXTRACTVALUE (n.COLUMN_VALUE, '/*') AS NODE_VALUE,
n.COLUMN_VALUE.getrootelement () AS NODE_NAME
FROM (SELECT EXTRACT (
XMLType (
'<?xml version = ''1.0''?>
<ROWSET>
<ROW num="1">
<GENDER_ID>2</GENDER_ID>
<GENDER>Male</GENDER>
<GENDER_CODE>M</GENDER_CODE>
<LAST_MODIFIED_BY_USER>bob.smith</LAST_MODIFIED_BY_USER>
<LAST_MODIFIED_BY_DATE>08-JUN-13</LAST_MODIFIED_BY_DATE>
</ROW>
</ROWSET>'),
'//ROWSET/ROW')
AS data
FROM DUAL) x,
TABLE (XMLSEQUENCE (EXTRACT (x.data, '/ROW/*'))) n
输出:
NODE_VALUE NODE_NAME
-----------------------------------
2 GENDER_ID
Male GENDER
M GENDER_CODE
bob.smith LAST_MODIFIED_BY_USER
08-JUN-13 LAST_MODIFIED_BY_DATE