Avalados por :

Como lidar com a seção CDATA em XML: Guia para obter o conteúdo do elemento Data

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

Olá.

Acabei de fazer meu primeiro mapeamento em Java PI 7.0 e até agora meu programa está funcionando bem,

no entanto, você sabe como posso lidar com a seção CDATA em XML?

Por exemplo


<?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>
        
    ......
        
]]>

Como posso obter o conteúdo do elemento Data?

Saudações

Xinaxu.

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

4 Respuestas

0
Cargando...

Olá Xinaxu,

Aqui está o código de mapeamento 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 gerado automaticamente
		
	}

}
0
Cargando...

Olá Xinaxu,

deixe-me esclarecer alguns fatos sobre a seção CDATA do xml. CDATA significa dados de caracteres (não analisados). O termo CDATA é usado para dados de texto que não devem ser analisados pelo analisador XML. Mesmo que você escreva caracteres ilegais dentro da seção CDATA, eles serão ignorados pelo analisador. Uma seção CDATA deve começar com

 "<![CDATA[" e terminar com ""]]>

. Agora, no XML de exemplo que você forneceu, o CDATA começa com

"& lt;![CDATA["

assim para o analisador isso não é mais uma seção CDATA, mas sim uma seção de texto normal.

De acordo com o seu primeiro post, você precisava de uma solução para a seção CDATA e o programa anterior atende exatamente à sua necessidade.

Se dentro de uma seção CDATA válida o XML contiver caracteres inválidos, o analisador lançará exceções. Agora suponha que seu XML de origem seja como mostrado abaixo

 
<?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> 

O XML de saída será

 
<?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> 

O código de mapeamento java é mostrado no meu próximo post abaixo. As declarações de importação estão mostradas aqui, pois o código está sendo distorcido.


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...

Olá, anupamsap

Agradeço muito a sua ajuda, fiz testes com o seu código e funcionou no tempo de design, no entanto, não funciona no tempo de execução.

Para verificar, fiz um teste simples a partir da Interface de Mapeamento e não reproduz os nós CData.

Extraí o payload do Monitoramento.

Meu cenário é de JDBC para Arquivo.

O payload de entrada altera o valor "<" para "& lt;" e ">" para "& gt;", tornando difícil para o Analisador Java extrair os dados.


<?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>

Como posso resolver isso?

Obrigado.

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

Olá Xinaxu,

deixe o XML de origem após todas as correções


<?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>
        
        

]]>

Como você sabe, tudo o que você escreve dentro da seção CDATA é ignorado pelo analisador. Portanto, se você escrever o XML de origem que você escreveu em sua pergunta, não receberá nenhum erro por isso. Se deseja interpretar a seção CDATA como tags XML, é necessário garantir que os dados XML sejam válidos dentro da seção CDATA. Isso ocorre porque você está aplicando um analisador separado para interpretar o conteúdo da seção CDATA. Agora, este analisador lançará exceções se a seção CDATA contiver um XML inválido. Por favor, tenha cuidado com isso.

Agora, sobre o seu problema. Podemos usar um analisador DOM para interpretar o conteúdo da seção CDATA como XML. Aqui está um código de exemplo para PI 7.0 que faz exatamente isso. Para simplicidade, estou lidando apenas com a seção CDATA aqui.


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?