Algoritmo para obtener valores de un XML JAVA
Hola, soy John Michel Rivera de Leon. Este post les muestra un algoritmo simple para obtener los valores de un XML sin necesidad de utilizar algun API de compra.
No pagues por lo que puedes hacer xD.
Muy bien, el programa hace lo siguiente:
Obtenemos una respuesta o XML, en este caso una variable CLOB de Oracle, que permite un archivo de hasta 4gb de texto.
Este archivo tiene dentro la respuesta XML con muchisimos datos dentro de tags.
Aqui un ejemplo:
La respuesta XML original obtenida es la siguiente:
Esta respuesta debe ser manejada para obtener únicamente los valores y pasarlos como parámetros al procedimiento SICAP_P_Insert_Users (que es un Store Procedure de Oracle para almacenar los datos en la Base de datos). La respuesta anterior debe ser convertida a la lista
Valor 1
Valor 2
…..
Valor N
El algoritmo crea unos arreglos para almacenar los nombres de los atributos y otro para sus valores. En esta caso dos arreglos con un tamaño de 25 registros (Que son los tags que conocemos de los cuales queremos obtener el valor, puede ser de tamaño N).
Finamente se crea otro arreglo para almacenar la respuesta XML en forma de lista tomando como salto de línea el carácter “<” que indica la apertura de un tag (para esto utilizamos el metodo split).
Después se genera un bucle que va desde 0 hasta el tamaño del arreglo de la respuesta XML.
Una vez dentro del bucle se busca la posición en la línea i de la respuesta XML el carácter “>” este indica el fin de un tag. Despues se busca el tamaño final de la línea i. Finalmente se obtiene el tag de esa línea seleccionando desde el inicio hasta donde inicia el carácter “>”.
Ya que se tienen esos datos se inicia otro bucle que va desde 0 hasta el 25 que es el número de atributos.
Una vez dentro de este nuevo bucle se compara el tag obtenido con los que se almacenaron al inicio sobre un arreglo. Si coincide el tag con alguno de los que se tienen registrados, entonces en esa línea se encuentra el valor del tag que es el que queremos almacenar. Si coincide entonces obtenemos el valor seleccionando desde la posición del carácter “>”+1 hasta el tamaño total de la línea.
Esta valor se almacena en el registro k del arreglo de respuestas, esto se repite con el resto de tags conocidos. Si el tag que se obtiene es el “/TransferenciaDTO” esto quiere indicar que aquí termina el primer bloque de datos, por lo tanto deben de registrarse en la base de datos.
Cuando se recibe este tag se llama al procedimiento almacenado SICAP_P_Insert_Users, pasándole como parámetros los datos obtenidos.
Esto se repite para todas las líneas de la respuesta XML. Cuando finaliza todo se cierra la conexión con la base de datos, si surge algún error este es retornado hacia la base de datos y entonces se registra.
Para comprender mejor el algoritmo este es un ejemplo sencillo.
Se recibe la respuesta original como.
<EMPLID>2936172</EMPLID><COMPANY>Oracle</COMPANY>
Se realiza un split con el carácter “<” el cual lo ordena en forma de lista.
EMPLID>2936172
/EMPLID>
COMPANY>Oracle
/COMPANY>
Se obtiene la primera linea y se busca la posicion del character “>”
EMPLID>2936172
Posición=6
Ahora se obtiene el tamaño total de la cadena para conocer el final.
EMPLID>2936172
Tamaño=14
Se obtiene el tag seleccionando desde el origen hasta donde inicia el carácter “>”.
EMPLID>2936172
Tag=EMPLID
Ahora se compara el Tag obtenido con los que se registra en el arreglo de tags conocidos. Como el tag EMPLID esta registrado entonces se almacena en el arreglo de respuestas. Se obtiene la respuesta seleccionando desde la posición de carácter “>”+1 hasta el tamaño total de la cadena que indica el final.
EMPLID>2936172
Respuesta=2936172
Esto se realiza con todos las líneas obtenidas de la respuesta XML. Una vez que se recibe el tag “/TransferenciaDTO” que sabemos que es el que indica el fin de un bloque de datos(no se incluye en el arreglo de tags conocidos, pues es el de fin de bloque), entonces se invoca al procedimiento almacenado pasándole como argumentos los valores obtenidos para ser registrados.
Aqui mi codigo:
Este algoritmo puede ser adaptado para hacerlo con un archivo.xml, o como se guste, pues lo importante es tener el texto del XML en una variable String y conocer los tags de los cuales queremos obtener la informacion.
Para hacer sus pruebas, pueden cambiar la variable de typo Oracle.CLOB a un String y le pasan como parametro una cadea de XML.
Con esto se ahorran lo que cueste un API que realiza este procedimiento.
Si te sirvio la informacion, deja tu comentario, o te caera una maldicion (en especial los que solo agregan a favoritos y no comentan, ya que solo les interesa el codigo )
Hola, soy John Michel Rivera de Leon. Este post les muestra un algoritmo simple para obtener los valores de un XML sin necesidad de utilizar algun API de compra.
No pagues por lo que puedes hacer xD.
Muy bien, el programa hace lo siguiente:
Obtenemos una respuesta o XML, en este caso una variable CLOB de Oracle, que permite un archivo de hasta 4gb de texto.
Este archivo tiene dentro la respuesta XML con muchisimos datos dentro de tags.
Aqui un ejemplo:
La respuesta XML original obtenida es la siguiente:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Header/><soapenv:Body><p24:envioResponse xmlns:p24="http://service.com_sicap_rh.metlife.mx.com"><envioReturn><TransferenciaDTO><EMPLID>2936172</EMPLID><FIRST_NAME>John</FIRST_NAME><LAST_NAME>Rivera</LAST_NAME><SECOND_LAST_NAME>de León</SECOND_LAST_NAME><COMPANY>MetLife</COMPANY><DEPTID>239152</DEPTID><DEPTID_DESCR>ConsultoresTI</DEPTID_DESCR><LOCATION>MX</LOCATION><LOCATION_DESCR>Ciudad México</LOCATION_DESCR><JOBCODE>21</JOBCODE><JOBCODE_DESCR>LiderP</JOBCODE_DESCR><REPORTS_TO>2453211</REPORTS_TO><REPORTS_TO_EMPLID>2736122</REPORTS_TO_EMPLID><REPORTS_FIRST_NAME>Jose</REPORTS_FIRST_NAME><REPORTS_LAST_NAME>Ponce</REPORTS_LAST_NAME><REPORTS_SEC_NAME>De León</REPORTS_SEC_NAME><EMPL_STATUS>1</EMPL_STATUS><NATIONAL_ID>7</NATIONAL_ID><EMAIL_ADDR> [email protected] </EMAIL_ADDR><MANAGER_LEVEL>5</MANAGER_LEVEL><MLM_EMPLID>2372412</MLM_EMPLID><MLM_REPORTS_TO>2834124</MLM_REPORTS_TO><AREA>11</AREA><MLM_REPORTS_TO_2>5273132</MLM_REPORTS_TO_2>2835123<MLM_REPORTS_TO_3>2513421</MLM_REPORTS_TO_3></TransferenciaDTO>
… Hasta N registros
Esta respuesta debe ser manejada para obtener únicamente los valores y pasarlos como parámetros al procedimiento SICAP_P_Insert_Users (que es un Store Procedure de Oracle para almacenar los datos en la Base de datos). La respuesta anterior debe ser convertida a la lista
Valor 1
Valor 2
…..
Valor N
El algoritmo crea unos arreglos para almacenar los nombres de los atributos y otro para sus valores. En esta caso dos arreglos con un tamaño de 25 registros (Que son los tags que conocemos de los cuales queremos obtener el valor, puede ser de tamaño N).
Finamente se crea otro arreglo para almacenar la respuesta XML en forma de lista tomando como salto de línea el carácter “<” que indica la apertura de un tag (para esto utilizamos el metodo split).
Después se genera un bucle que va desde 0 hasta el tamaño del arreglo de la respuesta XML.
Una vez dentro del bucle se busca la posición en la línea i de la respuesta XML el carácter “>” este indica el fin de un tag. Despues se busca el tamaño final de la línea i. Finalmente se obtiene el tag de esa línea seleccionando desde el inicio hasta donde inicia el carácter “>”.
Ya que se tienen esos datos se inicia otro bucle que va desde 0 hasta el 25 que es el número de atributos.
Una vez dentro de este nuevo bucle se compara el tag obtenido con los que se almacenaron al inicio sobre un arreglo. Si coincide el tag con alguno de los que se tienen registrados, entonces en esa línea se encuentra el valor del tag que es el que queremos almacenar. Si coincide entonces obtenemos el valor seleccionando desde la posición del carácter “>”+1 hasta el tamaño total de la línea.
Esta valor se almacena en el registro k del arreglo de respuestas, esto se repite con el resto de tags conocidos. Si el tag que se obtiene es el “/TransferenciaDTO” esto quiere indicar que aquí termina el primer bloque de datos, por lo tanto deben de registrarse en la base de datos.
Cuando se recibe este tag se llama al procedimiento almacenado SICAP_P_Insert_Users, pasándole como parámetros los datos obtenidos.
Esto se repite para todas las líneas de la respuesta XML. Cuando finaliza todo se cierra la conexión con la base de datos, si surge algún error este es retornado hacia la base de datos y entonces se registra.
Para comprender mejor el algoritmo este es un ejemplo sencillo.
Se recibe la respuesta original como.
<EMPLID>2936172</EMPLID><COMPANY>Oracle</COMPANY>
Se realiza un split con el carácter “<” el cual lo ordena en forma de lista.
EMPLID>2936172
/EMPLID>
COMPANY>Oracle
/COMPANY>
Se obtiene la primera linea y se busca la posicion del character “>”
EMPLID>2936172
Posición=6
Ahora se obtiene el tamaño total de la cadena para conocer el final.
EMPLID>2936172
Tamaño=14
Se obtiene el tag seleccionando desde el origen hasta donde inicia el carácter “>”.
EMPLID>2936172
Tag=EMPLID
Ahora se compara el Tag obtenido con los que se registra en el arreglo de tags conocidos. Como el tag EMPLID esta registrado entonces se almacena en el arreglo de respuestas. Se obtiene la respuesta seleccionando desde la posición de carácter “>”+1 hasta el tamaño total de la cadena que indica el final.
EMPLID>2936172
Respuesta=2936172
Esto se realiza con todos las líneas obtenidas de la respuesta XML. Una vez que se recibe el tag “/TransferenciaDTO” que sabemos que es el que indica el fin de un bloque de datos(no se incluye en el arreglo de tags conocidos, pues es el de fin de bloque), entonces se invoca al procedimiento almacenado pasándole como argumentos los valores obtenidos para ser registrados.
Aqui mi codigo:
[color=#000000]
import oracle.jdbc.driver.*;
import oracle.sql.*;
import java.sql.*;
// John Michel Rivera de León
public class ParsingXML {
public ParsingXML(){
}
public static String StoreData(oracle.sql.CLOB XMLSOAP, String Usuario) throws SQLException{
//creamos la conexion hacia la base de datos de manera interna, en este caso especificamos
Connection conn =
DriverManager.getConnection("jdbc:default:connection:");
CallableStatement cstmt = conn.prepareCall("{CALL sicap_pck_ws.sicap_p_insert_users(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
try {
int fin=((int) XMLSOAP.length());
//se realiza el split para la respuesta XML/SOAP
String[] palabras = XMLSOAP.getSubString(1,fin ).split("<");
String[]TagsXML=new String[25];//para almacenar los tags clave
String[]Responses= new String[25];//para almacen de resultados
TagsXML[0]="EMPLID";
TagsXML[1]="FIRST_NAME";
TagsXML[2]="LAST_NAME";
TagsXML[3]="SECOND_LAST_NAME";
TagsXML[4]="COMPANY";
TagsXML[5]="DEPTID";
TagsXML[6]="DEPTID_DESCR";
TagsXML[7]="LOCATION";
TagsXML[8]="LOCATION_DESCR";
TagsXML[9]="JOBCODE";
TagsXML[10]="JOBCODE_DESCR";
TagsXML[11]="REPORTS_TO";
TagsXML[12]="REPORTS_TO_EMPLID";
TagsXML[13]="REPORTS_FIRST_NAME";
TagsXML[14]="REPORTS_LAST_NAME";
TagsXML[15]="REPORTS_SEC_NAME";
TagsXML[16]="EMPL_STATUS";
TagsXML[17]="NATIONAL_ID";
TagsXML[18]="EMAIL_ADDR";
TagsXML[19]="MANAGER_LEVEL";
TagsXML[20]="MLM_EMPLID";
TagsXML[21]="MLM_REPORTS_TO";
TagsXML[22]="AREA";
TagsXML[23]="MLM_REPORTS_TO_2";
TagsXML[24]="MLM_REPORTS_TO_3";
int localiza=0;
int finals=0;
String trimtag="";
for(int i=1;i<palabras.length;i++){
localiza= palabras[i].indexOf(">"); //1 buscamos el inicio
finals= palabras[i].length(); //buscamos el final de la linea
trimtag=palabras[i].substring(0, localiza);//seleccionamos primero valor del primer tag deacuerdo a su talla y checamos
//ya que obtenimos el 1er tag que siempre es el mismo pasamos linea por linea buscandolo
for(int k=0;k<TagsXML.length;k++){// se verifica el tag con los almacenados en el arreglo
if(TagsXML[k].matches(trimtag)){ // si con cuaerda con alguno entonces almacena el valor
if(palabras[i].substring(finals-1, finals).matches("n")){
Responses[k]=palabras[i].substring(localiza+1, finals-1);
}else{
Responses[k]=palabras[i].substring(localiza+1, finals);
}
}
if(trimtag.matches("/TransferenciaDTO")){//si se obtiene el tag de fin de clase se almacena el resultado
k=TagsXML.length;
cstmt.setString(1, Responses[0]);
cstmt.setString(2, Responses[1]);
cstmt.setString(3, Responses[2]);
cstmt.setString(4, Responses[3]);
cstmt.setString(5, Responses[4]);
cstmt.setString(6, Responses[5]);
cstmt.setString(7, Responses[6]);
cstmt.setString(8, Responses[7]);
cstmt.setString(9, Responses[8]);
cstmt.setString(10, Responses[9]);
cstmt.setString(11, Responses[10]);
cstmt.setString(12, Responses[11]);
cstmt.setString(13, Responses[12]);
cstmt.setString(14, Responses[13]);
cstmt.setString(15, Responses[14]);
cstmt.setString(16, Responses[15]);
cstmt.setString(17, Responses[16]);
cstmt.setString(18, Responses[17]);
cstmt.setString(19, Responses[18]);
cstmt.setString(20, Responses[19]);
cstmt.setString(21, Responses[20]);
cstmt.setString(22, Responses[21]);
cstmt.setString(23, Responses[22]);
cstmt.setString(24, Responses[23]);
cstmt.setString(25, Responses[24]);
cstmt.setString(26, Usuario);
cstmt.executeUpdate();
}
}
}//fin for
} catch (Exception e) {//si ocurre algun error lo cachamos
return "Error ocurrido durante la transacción: n"+e;
}
//cerramos la conexion a la B.D
cstmt.close();
return "TERMINADO CORRECTAMENTE: n"+XMLSOAP.getSubString(1,32000 );
}
}
[/color]
Este algoritmo puede ser adaptado para hacerlo con un archivo.xml, o como se guste, pues lo importante es tener el texto del XML en una variable String y conocer los tags de los cuales queremos obtener la informacion.
Para hacer sus pruebas, pueden cambiar la variable de typo Oracle.CLOB a un String y le pasan como parametro una cadea de XML.
Con esto se ahorran lo que cueste un API que realiza este procedimiento.
Si te sirvio la informacion, deja tu comentario, o te caera una maldicion (en especial los que solo agregan a favoritos y no comentan, ya que solo les interesa el codigo )
