它不是XML或JSON,我在这看什么?我可以轻松地将其转换为表格吗?

时间:2016-02-24 21:40:23

标签: oracle parsing

我被要求从现有数据库中提取数据以获取工作程序。该数据与过滤器实用程序有关。我需要能够提取过滤器数据并最终构建一个匹配的SQL语句。问题是,我不认识数据格式。

<Filter Entity="Ticket">
    <Where>
        <Field Name="COLUMN_1" Value="A" CaseSensitive="false" />
        <Field Name="COLUMN_2" Value="B" CaseSensitive="false" />
        <Field Name="COLUMN_3" Value="C" CaseSensitive="false" />
        <Field Name="COLUMN_4" Value="D" CaseSensitive="false" />
    </Where>
    <Sort>
        <Field Name="COLUMN_1" Direction="Ascending" />
    </Sort>
    <Grouping>
        <Field Name="COLUMN_1" Order="0" />
        <Field Name="COLUMN_2" Order="1" />
    </Grouping>
</Filter>

最后,我需要将其解析成某种可用的格式。对我来说,这意味着一张桌子。我以前在Oracle中使用过XMLTable函数,如果这是XML的话会很有用。有人有提示吗?

所需的输出表:

|CLAUSE   |NAME     |VALUE |CASE  |DIRECTION |ORDER |
-----------------------------------------------------
|Where    |COLUMN_1 |A     |false |          |      |
|Where    |COLUMN_2 |B     |false |          |      |
|Where    |COLUMN_3 |C     |false |          |      |
|Where    |COLUMN_4 |D     |false |          |      |
|Sort     |COLUMN_1 |      |      |Ascending |      |
|Grouping |COLUMN_2 |      |      |          |0     |
|Grouping |COLUMN_1 |      |      |          |1     |

DB是Oracle 11g。我不知道用什么语言来构建应用程序。

1 个答案:

答案 0 :(得分:2)

正如Tom Kimber在评论中所说的那样,这就是XML;它只是使用超出你希望的属性而不是元素/节点值。

您可以使用XMLTable提取属性值以及元素/节点值:

select * from xmltable (
  '/Filter/*/Field'
  passing xmltype('<Filter Entity="Ticket">
    <Where>
        <Field Name="COLUMN_1" Value="A" CaseSensitive="false" />
        <Field Name="COLUMN_2" Value="B" CaseSensitive="false" />
        <Field Name="COLUMN_3" Value="C" CaseSensitive="false" />
        <Field Name="COLUMN_4" Value="D" CaseSensitive="false" />
    </Where>
    <Sort>
        <Field Name="COLUMN_1" Direction="Ascending" />
    </Sort>
    <Grouping>
        <Field Name="COLUMN_1" Order="0" />
        <Field Name="COLUMN_2" Order="1" />
    </Grouping>
</Filter>')
  columns clause varchar2(10) path 'local-name(..)',
    name varchar2(10) path '@Name',
    value varchar2(10) path '@Value',
    case_sensitive varchar2(5) path '@CaseSensitive',
    direction varchar2(10) path '@Direction',
    order_num number path '@Order'
);

CLAUSE     NAME       VALUE      CASE_ DIRECTION   ORDER_NUM
---------- ---------- ---------- ----- ---------- ----------
Where      COLUMN_1   A          false                      
Where      COLUMN_2   B          false                      
Where      COLUMN_3   C          false                      
Where      COLUMN_4   D          false                      
Sort       COLUMN_1                    Ascending            
Grouping   COLUMN_1                                        0
Grouping   COLUMN_2                                        1

路径中的@attr获取具有该名称的属性; local-name(..)获取父节点的元素名称(Field节点)。

例如,你也可以使用更复杂的XPath将属性转换为元素值,但我不确定你在这里获得多少收获。