使用 Oracle xmltable 解析 XML 时未获得正确的结果

问题描述 投票:0回答:1

我需要解析下面的 XML 以获得下表形式的结果。我得到 NULL 列,没有任何数据行。我预计低于 3 行 3 列。请帮忙提前谢谢。

所需输出

UNIFIER_US_XCPG1_VIEW   1   2024-10-16T08:36:53.000+00:00
UNIFIER_UXCORY_VIEW         5   2024-10-16T08:36:53.000+00:00
UNIFIER_UXBLS_VIEW          9   2024-10-16T08:36:53.000+00:00

查询:

WITH tbl AS (
    SELECT
        xmltype('<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- Generated by Oracle BI Publisher 12.2.1.4.0 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title></title>
<style type="text/css" id="internalStyle">
.c0 {height: 13.048pt;}
.c1 {word-wrap:break-word;border-width: 0.8pt;border-color: #777777;border-style: solid;width:33.947%;background-color: #cfe0f1;}
.c2 {line-height: 9.248pt;margin-top: 0.0pt;margin-bottom: 0.0pt;margin-left: 3.4pt;margin-right: 3.399pt;}
.c3 {font-family: Tahoma;font-size: 8.0pt;color: #000000;}
.c4 {word-wrap:break-word;border-width: 0.8pt;border-color: #777777;border-style: solid;width:25.413%;background-color: #cfe0f1;}
.c5 {line-height: 9.248pt;margin-top: 0.0pt;margin-bottom: 0.0pt;margin-left: 3.399pt;margin-right: 3.399pt;}
.c6 {word-wrap:break-word;border-width: 0.8pt;border-color: #777777;border-style: solid;width:40.639%;background-color: #cfe0f1;}
.c7 {height: 16.048pt;}
.c8 {word-wrap:break-word;border-width: 0.8pt;border-color: #777777;border-style: solid;width:33.947%;background-color: #ffffff;}
.c9 {word-wrap:break-word;border-width: 0.8pt;border-color: #777777;border-style: solid;width:25.413%;background-color: #ffffff;}
.c10 {text-align: right;line-height: 9.248pt;margin-top: 0.0pt;margin-bottom: 0.0pt;margin-left: 3.399pt;margin-right: 3.399pt;}
.c11 {word-wrap:break-word;border-width: 0.8pt;border-color: #777777;border-style: solid;width:40.639%;background-color: #ffffff;}
.c12 {margin-top: 0.0pt;margin-bottom: 9.0pt;table-layout:fixed;margin-right: auto;width: 369.1pt;border-collapse: collapse;}
</style>
</head>
<body>
<table class="c12">
<col width="33.947%"/>
<col width="25.413%"/>
<col width="40.639%"/>
<tr class="c0">
<td valign="top" class="c1"><p class="c2"><span class="c3">TABLE_NAME</span></p>
</td>
<td valign="top" class="c4"><p class="c5"><span class="c3">NUM_ROWS</span></p>
</td>
<td valign="top" class="c6"><p class="c5"><span class="c3">RUN_DATE</span></p>
</td>
</tr>
<tr class="c7">
<td valign="top" class="c8"><p class="c2"><span class="c3">UNIFIER_US_XCPG1_VIEW</span></p>
</td>
<td valign="top" class="c9"><p class="c10"><span class="c3">1</span></p>
</td>
<td valign="top" class="c11"><p class="c5"><span class="c3">2024-10-16T08:36:53.000+00:00</span></p>
</td>
</tr>
<tr class="c7">
<td valign="top" class="c8"><p class="c2"><span class="c3">UNIFIER_UXCORY_VIEW</span></p>
</td>
<td valign="top" class="c9"><p class="c10"><span class="c3">5</span></p>
</td>
<td valign="top" class="c11"><p class="c5"><span class="c3">2024-10-16T08:36:53.000+00:00</span></p>
</td>
</tr>
<tr class="c7">
<td valign="top" class="c8"><p class="c2"><span class="c3">UNIFIER_UXBLS_VIEW</span></p>
</td>
<td valign="top" class="c9"><p class="c10"><span class="c3">9</span></p>
</td>
<td valign="top" class="c11"><p class="c5"><span class="c3">2024-10-16T08:36:53.000+00:00</span></p>
</td>
</tr>
</table>
</body>
</html>') xml_data
    FROM
        dual
)
SELECT
    x.tablename,
    x.rowcount,
    x.rundate
FROM
     tbl
CROSS JOIN XMLTABLE ( '/body/table/tr'
        PASSING tbl.xml_data
    COLUMNS
        tablename VARCHAR2(100) PATH 'td[1]/p/span',
        rowcount VARCHAR2(100) PATH 'td[2]/p/span',
        rundate VARCHAR2(100) PATH 'td[2]/p/span'
) x;

请参阅上述详细信息以及查询和所需的表输出。

sql xml oracle
1个回答
0
投票

您的 Xpath

'/body/table/tr'
缺少开始
<html>
标签;并且它有一个命名空间,所以你也需要提供它作为默认值:

WITH tbl AS (
...
)
SELECT
    x.tablename,
    x.rowcount,
    x.rundate
FROM
     tbl
CROSS JOIN XMLTABLE (
        XMLNAMESPACES(default 'http://www.w3.org/1999/xhtml'),
        '/html/body/table/tr'
        PASSING tbl.xml_data
    COLUMNS
        tablename VARCHAR2(100) PATH 'td[1]/p/span',
        rowcount VARCHAR2(100) PATH 'td[2]/p/span',
        rundate VARCHAR2(100) PATH 'td[3]/p/span'
) x;
表名 行数 运行日期
表名称 NUM_ROWS 运行_日期
UNIFIER_US_XCPG1_VIEW 1 2024-10-16T08:36:53.000+00:00
UNIFIER_UXCORY_VIEW 5 2024-10-16T08:36:53.000+00:00
UNIFIER_UXBLS_VIEW 9 2024-10-16T08:36:53.000+00:00

小提琴

(您的

rundate
路径也在查看元素 2 而不是 3...)

© www.soinside.com 2019 - 2024. All rights reserved.