Avalados por :

Cómo manejar la sección CDATA en XML: Guía para obtener el contenido del elemento Data

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 75 Vistas
0
Cargando...

Hola.

Acabo de hacer mi primer mapeo de Java PI 7.0 y hasta ahora mi programa está bien,

sin embargo, ¿sabes cómo puedo manejar la sección CDATA en XML?

Por ejemplo


<?xml version="1.0" encoding="utf-8" ?> 
 <Header>
     <row>
        <ID>XXXXX</ID>
        <Process>XXXXY</Process> 
        <Data><![CDATA[<AP_Header> <TransactionID>FB60</TransactionID <VendorNumber>113939</VendorNumber>
        
    ......
        
]]>

¿Cómo puedo obtener el contenido del elemento Data?

Saludos

Xinaxu.

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola Xinaxu,

Aquí tienes el código de mapeo de Java.


public class Cdata implements StreamTransformation{
	
	public static void main(String[] args) {
	
		try{
			Cdata genFormat=new Cdata();
			FileInputStream in=new FileInputStream("C:\\Apps\\acm\\cdata.xml");
			FileOutputStream out=new FileOutputStream("C:\\Apps\\acm\\cdata1.xml");
			genFormat.execute(in,out);
			}
			catch(Exception e)
			{
			e.printStackTrace();
			}
	}

	public void execute(InputStream in, OutputStream out)
			throws StreamTransformationException {
		
		try
		{
			DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
			DocumentBuilder builderel=factory.newDocumentBuilder();
			/*documento de entrada en forma de XML*/
			Document docIn=builderel.parse(in);
            ...
			transform.transform(new DOMSource(docOut), new StreamResult(out));
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

	public void setParameter(Map arg0) {
		// TODO Método generado automáticamente
		
	}

}
0
Cargando...

Hi Xinaxu,

let me clarify some facts about CDATA section of xml.CDATA means (unparsed) character data. The term CDATA is used about text data that should not be parsed by the XML parser. Even if you write illegal characters within CDATA section it will be ignored by the parser. A CDATA section has to start with

 "<![CDATA[" and end with ""]]>

. Now in the sample XML you provided, CDATA begins with

"& lt;![CDATA["

thus to the parser this is no longer a CDATA section but a normal text section.

According to your first post you needed solution for CDATA section and the earlier program exactly meets your requirement.

If within a valid CDATA section the XML contains invalid characters, parser will throw exceptions. Now suppose your source XML is as shown below

 
<?xml version="1.0"; encoding="utf-8" ?> 
<Header> 
     <row> <ID>XXXXX</ID><Process>XXXXY</Process> 
<Data>&lt;![CDATA[&lt;AP_Header&gt; &lt;TransactionID&gt;FB60&lt;/TransactionID &gt;&lt;VendorNumber&gt;113939&lt;/VendorNumber&gt;&lt;/AP_Header&gt;]]&gt;</Data> 
    </row>     
</Header> 

The output xml will be

 
<?xml version="1.0"; encoding="UTF-8"?> 
<Header xmlns="urn:bp:xi:hr:edm:test:100"><Data><AP_Header> <TransactionID>FB60</TransactionID><VendorNumber>113939</VendorNumber></AP_Header></Data></Header> 

The java mapping code is a shown in my next post below. Import statements are shown here as the code is getting distorted.


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform
        
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola, anupamsap

Aprecio mucho tu ayuda, hice pruebas con tu código y funciona en tiempo de diseño, sin embargo, no lo hace en tiempo de ejecución.

Para verificar, hice una prueba simple desde la Interfaz de Mapeo y no reproduce los nodos CData.

Extraje el payload desde el Monitoreo.

Mi escenario es de JDBC a Archivo.

El payload de entrada cambia el valor "<" por "& lt;" y ">" por "& gt;", por lo que es difícil para el Analizador de Java extraer los datos.


<?xml version="1.0" encoding="utf-8" ?> 
 <Header>
     <row> <ID>XXXXX</ID><Process>XXXXY</Process> 
<Data>& lt;![CDATA[& lt;AP_Header& gt; & lt;TransactionID& gt;FB60& lt;/TransactionID & gt;& lt;VendorNumber& gt;113939& lt;/VendorNumber& gt;& lt;/AP_Header& gt;]]& gt;
        </Data>
    </row>    
</Header>

¿Cómo puedo resolver esto?

Gracias.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hi Xinaxu,

let the source XML after all corrections


<?xml version="1.0" encoding="utf-8" ?> 
 <Header>
     <row> <ID>XXXXX</ID><Process>XXXXY</Process> 
<Data><![CDATA[<AP_Header> <TransactionID>FB60</TransactionID ><VendorNumber>113939</VendorNumber></AP_Header>
        
        

]]>

As you know whatever you write within CDATA section is ignored by the parser. Thus if you write the source XML you have written in your question, you will not receive any errors for that. If you want to interpret the CDATA section as XML tags then you need to ensure that the XML data is valid within CDATA section. This is because you are then applying a separate parser to interpret contents of CDATA section. Now this parser will throw exceptions if CDATA section contains an invalid XML. Please be careful on this.

Now coming to your problem. We can use DOM parser to interpret contents of CDATA section as XML. Here is a sample code for PI 7.0 which exactly does that. For simplicity I am dealing with only CDATA section here.


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.sap.aii.mapping.api.StreamTransformation;
import com.sap.aii.mapping.api.StreamTransformationException;


public class Cdata implements StreamTransformation{

	
	
	public static void main(String[] args) {
	
		try{
			Cdata genFormat=new Cdata(
        
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?