【问题标题】:Procedure for parsing XML containing similar tags解析包含相似标签的 XML 的过程
【发布时间】:2016-08-29 17:46:00
【问题描述】:

我有一个XML 存储在表HOLDS_XML 中,列类型为XML_TYPE

<?xml version="1.0" encoding="UTF-8"?>
<cus:request xsi:schemaLocation="http://www.bt.com/btgs/solutions/message/customerRequest C:\SalesSchema_Latest\RequestManagementV1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sortarg="http://www.bt.com/btgs/solutions/library/SourceAndTarget" xmlns:siteType="http://www.bt.com/btgs/solutions/library/SiteType" xmlns:reqType="http://www.bt.com/btgs/solutions/library/RequestType" xmlns:prodType="http://www.bt.com/btgs/solutions/library/ProductType" xmlns:orgType="http://www.bt.com/btgs/solutions/library/OrganisationType" xmlns:ordType="http://www.bt.com/btgs/solutions/library/OrderType" xmlns:flexattType="http://www.bt.com/btgs/solutions/library/FlexattType" xmlns:contractType="http://www.bt.com/btgs/solutions/library/ContractType" xmlns:contactType="http://www.bt.com/btgs/solutions/library/ContractType" xmlns:addType="http://www.bt.com/btgs/solutions/library/AddressType" xmlns:cr="http://www.bt.com/btgs/solutions/message/customerRequest" xmlns:cus="http://www.bt.com/btgs/solutions/message/customerRequest" xmlns:prod="http://www.bt.com/btgs/solutions/library/ProductType">
  <sourceSystem name="Resign Tool" type="LQTWebsite"/>
  <targetSystem name="MESSIA" type="Sales Tools"/>
  <changeRequest customerRequestRef="" BTProjectManagementRef="">
    <billOfMaterials>
      <bomSiteItem siteID="ID000009" siteInternalID="1163642" BTSiteType="host">
        <organisation>
          <organisationRef>ID000003</organisationRef>
        </organisation>
        <siteContact>
          <role/>
          <firstName/>
          <lastName/>
          <telephone/>
          <mobile/>
          <fax/>
          <email/>
        </siteContact>
        <siteName>BIRMINGHAM_001</siteName>
        <siteReference>ID000009</siteReference>
        <siteAddress>
          <room/>
          <floor/>
          <building>BT BUILDING</building>
          <streetNumber>5</streetNumber>
          <streetName>BRINDLEY PLACE</streetName>
          <locality>BIRMINGHAM</locality>
          <city>BIRMINGHAM</city>
          <county-state>WEST MIDLANDS</county-state>
          <country ISOCountryCode="">UNITED KINGDOM</country>
          <postcode>B1 2BL</postcode>
        </siteAddress>
        <coordinates gridSystem="easting-and-northing">
          <x-coordinate/>
          <y-coordinate/>
        </coordinates>
        <installationLocation locID="ID000010">
          <subPremise>FLOOR 3 ROOM 6</subPremise>
        </installationLocation>                                   
      </bomSiteItem>
      <bomSiteItem siteID="ID000167" siteInternalID="1163644" BTSiteType="client">
        <organisation>
          <organisationRef>ID000003</organisationRef>
        </organisation>
        <siteContact>
          <role/>
          <firstName/>
          <lastName/>
          <telephone/>
          <mobile/>
          <fax/>
          <email/>
        </siteContact>
        <siteName>BIRMINGHAM_002</siteName>
        <siteReference>ID000167</siteReference>
        <siteAddress>
          <room/>
          <floor/>
          <building>BT BUILDING</building>
          <streetNumber>5</streetNumber>
          <streetName>BRINDLEY PLACE</streetName>
          <locality>BIRMINGHAM</locality>
          <city>BIRMINGHAM</city>
          <county-state>WEST MIDLANDS</county-state>
          <country ISOCountryCode="">UNITED KINGDOM</country>
          <postcode>B1 2BL</postcode>
        </siteAddress>
        <coordinates gridSystem="easting-and-northing">
          <x-coordinate/>
          <y-coordinate/>
        </coordinates>
        <installationLocation locID="ID000168">
          <subPremise>FLOOR 3 ROOM 9</subPremise>
        </installationLocation>
      </bomSiteItem>
      <bomSiteItem siteID="ID000208" siteInternalID="1163645" BTSiteType="client">
        <organisation>
          <organisationRef>ID000003</organisationRef>
        </organisation>
        <siteContact>
          <role/>
          <firstName/>
          <lastName/>
          <telephone/>
          <mobile/>
          <fax/>
          <email/>
        </siteContact>
        <siteName>BIRMINGHAM_003</siteName>
        <siteReference>ID000208</siteReference>
        <siteAddress>
          <room/>
          <floor/>
          <building>BT BUILDING</building>
          <streetNumber>5</streetNumber>
          <streetName>BRINDLEY PLACE</streetName>
          <locality>BIRMINGHAM</locality>
          <city>BIRMINGHAM</city>
          <county-state>WEST MIDLANDS</county-state>
          <country ISOCountryCode="">UNITED KINGDOM</country>
          <postcode>B1 2BL</postcode>
        </siteAddress>
        <coordinates gridSystem="easting-and-northing">
          <x-coordinate/>
          <y-coordinate/>
        </coordinates>
        <installationLocation locID="ID000209">
          <subPremise>FLOOR 6 ROOM 9</subPremise>
        </installationLocation>
      </bomSiteItem>
    </billOfMaterials>

我必须读取存储在表XML_MASTER 中的xpath,从xml 中提取值并将其插入到另一个表中。存储Xpath的表结构是这样的

            XPATH                                                   NODENAME        FIELDNAME
changeRequest/billOfMaterials/bomSiteItem/siteAddress/streetName    streetName      Site_Address_streetname
changeRequest/billOfMaterials/bomSiteItem/siteContact/telephone     telephone       Site_Address_telephone
changeRequest/billOfMaterials/bomSiteItem/siteContact/email         email           Site_Addres_email
changeRequest/billOfMaterials/bomSiteItem/siteAddress/floor         floor           Site_Address_floor
changeRequest/billOfMaterials/bomSiteItem/siteAddress/room          room            Site_Address_room
changeRequest/billOfMaterials/bomSiteItem/siteAddress/county-state  county-state    Site_Address_country-state
changeRequest/billOfMaterials/bomSiteItem/siteContact/mobile        mobile          Site_Address_mobile
changeRequest/billOfMaterials/bomSiteItem/siteAddress/locality      locality        Site_Address_locality
changeRequest/billOfMaterials/bomSiteItem/siteContact/firstName     firstName       Site_Address_firstName
changeRequest/billOfMaterials/bomSiteItem/siteAddress/building      building        Site_Address_building

我已经创建了一个程序如下

create or replace
PROCEDURE Xml_parser 
AS 
  TYPE cur_type IS ref CURSOR; 
  vxml         XMLTYPE; 
  Vvalue       Varchar2(100); 
  cur_string VARCHAR2(500); 
  vxpath       xml_master.xpath%TYPE; 
  Vnodename    xml_Master.Nodename%Type; 
    VFieldName    xml_master.fieldname%TYPE; 
  select_cur   CUR_TYPE; 
  verror       VARCHAR2(500); 

  Cursor Cur_Xml_Master Is 
    select  Xpath, Nodename, fieldname 
    from xml_master ;


BEGIN 
    SELECT xml_col 
    INTO   vxml 
    FROM   holds_xml; 

     dbms_output.Put_line ('inserted');

    OPEN cur_xml_master; 

    Loop 
        FETCH cur_xml_master INTO vxpath, vnodename, vfieldname; 

        Exit When Cur_Xml_Master%Notfound ;

        Cur_String := 'Select e."'
                        ||Vnodename||
                        '" From Xmltable(''/'' '
                        || 'Passing :xml columns "'
                        ||Vnodename||
                        '" varchar2(200) path '''
                        ||Vxpath||
                        ''' )e'; 

          dbms_output.Put_line (Cur_String);         


          OPEN select_cur FOR cur_string USING vxml; 
          dbms_output.Put_line ('after open');

                LOOP 
                    FETCH select_cur INTO vvalue; 

                    EXIT WHEN select_cur%NOTFOUND; 

                    dbms_output.Put_line (Cur_String);         
                    dbms_output.Put_line ('value is: '|| vvalue);

                END LOOP; 



CLOSE select_cur; 
END LOOP; 

CLOSE cur_xml_master; 

END;

但在运行此过程时出现错误

已插入 Select e.* From Xmltable('/' Passing :xml columns streetname varchar2(50) path 'changeRequest/billOfMaterials/bomSiteItem/siteAddress/streetName')e 打开后 错误:Xml_Parser -19279 - ORA-19279: XPTY0004 - XQuery 动态类型不匹配:预期的单例序列 - 得到多项序列

我想这是因为 XML 有多个 streetname 标签。读取所有值并将其插入某些变量的方法是什么。

【问题讨论】:

  • @J.Chomel 我不明白你在说什么?你想让我从哪里得到街道名称?
  • 我现在没有 XSD。实际上,它是我在 Oracle 中转换的 MS 访问中的一个相当老的数据库。我没有关于 XML 的任何其他 XSD
  • 我只是想从错误中猜测......当它只有一条记录时,你能加载文件吗? (删除其他 "billOfMaterials" 记录,在您的输入中只留下一条)。

标签: xml oracle xpath xmltype


【解决方案1】:

1) 这里不需要使用动态查询。

2) 将您的 xpath (//+您的 xpath) 放在 xmltable 之后,并在 xmltable 语句中定义默认列。

declare 
 v_xml xmltype := xmltype('<rowset>
                                                <row>
                                                 <x>1</x>
                                                 <y>lalal</y>
                                                </row>
                                                <row>
                                                 <x>2</x>
                                                 <y>y1</y>
                                                </row> 
                                               </rowset>');
 xpath varchar2(20) := '//rowset/row/x';                                              
begin  
 for rec in (select abc from xmltable(xpath passing v_xml columns abc varchar2(200) path '.') ) loop
  dbms_output.put_line(rec.abc);
 end loop;
end; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多