在我有更多标记具有相同名称的情况下,如何使用xmltype提取XML文档的特定标记的值?

时间:2015-02-19 13:43:08

标签: xml oracle xml-parsing clob xmltype

我是Oracle的新手,我在从DB文件表的 CLOG 字段内的XML文档中提取特定字段时遇到以下问题。

所以,在我的XML中,我有这个结构:

<?xml version="1.0" encoding="UTF-8"?>
<in:Invoice xmlns:in="urn:oasis:.....">

    <cac:AccountingSupplierParty>
        <cac:Party>
            .............................
            .............................

            /* FIRST cac:PartyLegalEntity that contains a cbc:CompanyID element */
            <cac:PartyLegalEntity>
                <cbc:CompanyID>VALUE-1</cbc:CompanyID>
                .............................
                .............................
                </cac:RegistrationAddress>
            </cac:PartyLegalEntity>

            /* SECOND cac:PartyLegalEntity that contains a cbc:CompanyID element */
            <cac:PartyLegalEntity>
                <cbc:CompanyID>VALUE-2</cbc:CompanyID>
                .............................
                .............................
            </cac:PartyLegalEntity>

        </cac:Party>
    </cac:AccountingSupplierParty>
</in:Invoice>

现在进入查询我必须获取 SECOND cac:PartyLegalEntity 元素中 cbc:CompanyID 元素中包含的字符串值( VALUE -2 值)。

我这样做了:

xmltype (d.documento).EXTRACT (
      '//cac:AccountingSupplierParty//cac:PartyLegalEntity/cbc:CompanyID/text()')
      .getStringVal() AS PIVA_MITTENTE

但是这样做我的查询结果就是 PIVA_MITTENTE 列,其中包含值 VALUE-1VALUE-2 instedad VALUE- 2 这是我想要的。

我认为问题在于 标记(具有相同名称)的容器标记( )是相同的,并且在这些标记中我提取了值相同标签

我无法修改XML,因此我可以某种方式指定我希望 SECOND 标记内的 标记的值到我的XML中吗?我该怎么办并解决这个问题?

编辑1:

我的原始查询就是这个:

SELECT

xmltype (d.documento).EXTRACT (
      '//cac:AccountingSupplierParty//cac:PartyLegalEntity/cac:RegistrationAddress/cbc:PostalZone/text()')
      .getStringVal() AS CAP_MITTENTE,  

xmltype (d.documento).EXTRACT (
      '//cac:AccountingSupplierParty//cac:PartyLegalEntity/cbc:CompanyID/text()')
      .getStringVal() AS PIVA_MITTENTE

FROM coda_tx c, documenti_tx d
WHERE   C.FK_TIPO_DOC = 99
        AND C.FK_STATO = 1
        AND C.FK_PIVA_MITTENTE = '11111111'
        AND C.PK_CODA = D.PFK_CODA
        AND C.CANALE='STA';

第二个 xmltype(d.documento).EXTRACT 是给我描述问题的那个。

如何将 XMLTABLE 的使用集成到我之前的查询中?

1 个答案:

答案 0 :(得分:1)

您需要使用XMLTable功能。您的查询将如下所示:

以下是doc:

的示例
SELECT warehouse_name warehouse,
   warehouse2."Water", warehouse2."Rail"
   FROM warehouses,
   XMLTABLE('/Warehouse'
      PASSING warehouses.warehouse_spec
      COLUMNS 
         "Water" varchar2(6) PATH '/Warehouse/WaterAccess',
         "Rail" varchar2(6) PATH '/Warehouse/RailAccess') 
      warehouse2;

我相信你可以弄清楚如何通过你的XPATH。

更新: 在你的情况下,它看起来像这样:

SELECT d.*,
       x.company_id
 FROM d,
      XMLTABLE('//cac:AccountingSupplierParty//cac:PartyLegalEntity/'
              PASSING d.documento 
              COLUMNS company_id varchar2(6) PATH '/cbc:CompanyID'
              ) x;