read - Cómo analizar el xml en pl-sql?
xmlelement oracle (2)
Tengo una cadena que contiene xml y textos ficticios juntos de la siguiente manera.
Necesito leer el valor Hola mundo y 999 .
¿Me puede ayudar por favor?
[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>
Además, es posible que desee utilizar 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;
Esto te daría el resultado:
PARAM_ID | NAME | VALUE
------------------------------------------
1 | SMS | Hello world
2 | ERROR_CODE | 999
Además, una versión sintonizada de la solución de Shaun Peterson (sin cambiar el contexto 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;
Hola, extrae el xml de esta cadena, lo pongo en un tipo xml y luego procedo desde allí. Vea abajo para un ejemplo.
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;
Esto te dará la salida
MY_SMS = Hellow World
MY_ERROR_CODE = 999