【问题标题】:How to parse xml in pl-sql?如何在pl-sql中解析xml?
【发布时间】:2015-09-03 11:33:01
【问题描述】:

我有一个包含 xml 和虚拟文本的字符串,如下所示。

我需要读取值 Hello world999

你能帮忙吗?

[GCM] Dummy text1
[GCM] Dummy text2

<PARAMETER_LIST>
  <PARAMETER>
    <NAME>SMS</NAME> 
    <VALUE>Hello world</VALUE>
  </PARAMETER>
  <PARAMETER>
    <NAME>ERROR_CODE</NAME>
    <VALUE>999</VALUE>
  </PARAMETER> 
</PARAMETER_LIST> 

【问题讨论】:

    标签: xml plsql xml-parsing


    【解决方案1】:

    另外,您可能想使用 XMLTABLE:

    SELECT
      px.*
    FROM
      XMLTABLE(
        '/PARAMETER_LIST/PARAMETER' PASSING 
          XMLTYPE(
            REGEXP_REPLACE('
                  [GCM] Dummy text1
                  [GCM] Dummy text2
                  <PARAMETER_LIST>
                    <PARAMETER>
                      <NAME>SMS</NAME> 
                      <VALUE>Hello world</VALUE>
                    </PARAMETER>
                    <PARAMETER>
                      <NAME>ERROR_CODE</NAME>
                      <VALUE>999</VALUE>
                    </PARAMETER> 
                  </PARAMETER_LIST>'
                  ,'^[^<]+'
                  ,''
                  )
            )
        COLUMNS param_id FOR ORDINALITY
        ,name VARCHAR2(40) PATH 'NAME'
        ,value VARCHAR2(400) PATH 'VALUE'
      ) px;
    

    这会给你结果:

      PARAM_ID  |    NAME      |    VALUE
    ------------------------------------------
       1        |    SMS       |  Hello world
       2        |  ERROR_CODE  |   999
    

    此外,Shaun Peterson 的解决方案稍作调整(无需切换 PLSQL - SQL 上下文):

    declare
    
    MY_STRING VARCHAR2(4000) := '[GCM] DUMMY TEXT1 [GCM] DUMMY TEXT2 <PARAMETER_LIST><PARAMETER><NAME>SMS</NAME><VALUE>Hellow world</VALUE></PARAMETER><PARAMETER><NAME>ERROR_CODE</NAME><VALUE>999</VALUE></PARAMETER></PARAMETER_LIST>';
    MY_XML XMLTYPE;
    
    MY_SMS VARCHAR2(100);
    MY_ERROR_CODE VARCHAR2(100); 
    
    begin
    
    MY_XML := XMLTYPE(SUBSTR(MY_STRING, INSTR(MY_STRING, '<'))) ;
    MY_SMS := MY_XML.EXTRACT('/PARAMETER_LIST/PARAMETER[NAME="SMS"]/VALUE/text()').getstringval;
    MY_ERROR_CODE := MY_XML.EXTRACT('/PARAMETER_LIST/PARAMETER[NAME="ERROR_CODE"]/VALUE/text()').getstringval;
    
    DBMS_OUTPUT.PUT_LINE('MY_SMS = ' || MY_SMS);
    DBMS_OUTPUT.PUT_LINE('MY_ERROR_CODE = ' || MY_ERROR_CODE);
    
    end;
    

    【讨论】:

      【解决方案2】:

      您好,我将从该字符串中提取 xml,将其放入 xml 类型中,然后从那里进行处理。请参阅下面的示例。

      declare
      
      MY_STRING VARCHAR2(4000) := '[GCM] DUMMY TEXT1 [GCM] DUMMY TEXT2 <PARAMETER_LIST><PARAMETER><NAME>SMS</NAME><VALUE>Hellow world</VALUE></PARAMETER><PARAMETER><NAME>ERROR_CODE</NAME><VALUE>999</VALUE></PARAMETER></PARAMETER_LIST>';
      MY_XML XMLTYPE;
      
      MY_SMS VARCHAR2(100);
      MY_ERROR_CODE VARCHAR2(100); 
      
      begin
      
      SELECT XMLTYPE(SUBSTR(MY_STRING, INSTR(MY_STRING, '<'))) 
      INTO MY_XML
      FROM DUAL;
      
      SELECT EXTRACTVALUE(MY_XML, '/PARAMETER_LIST/PARAMETER[NAME="SMS"]/VALUE'),
             EXTRACTVALUE(MY_XML, '/PARAMETER_LIST/PARAMETER[NAME="ERROR_CODE"]/VALUE')
      INTO MY_SMS, MY_ERROR_CODE
      FROM DUAL;
      
      DBMS_OUTPUT.PUT_LINE('MY_SMS = ' || MY_SMS);
      DBMS_OUTPUT.PUT_LINE('MY_ERROR_CODE = ' || MY_ERROR_CODE);
      
      end;
      

      这会给你输出

      MY_SMS = Hellow World

      MY_ERROR_CODE = 999

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 2013-06-22
        • 1970-01-01
        相关资源
        最近更新 更多