2011-12-13 60 views
7

Cómo analizar un XML que tiene datos incluidos en <![CDATA[---]... ¿cómo podemos analizar el xml y obtener los datos incluidos en CDATA ???Cómo analizar XML para <![CDATA[]]>

+0

¿Analiza el archivo "a mano" o le utiliza cualquier clase XMLReader (y cuál)? – Thargor

Respuesta

8
public static void main(String[] args) throws Exception { 
    File file = new File("data.xml"); 
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
//if you are using this code for blackberry xml parsing 
    builder.setCoalescing(true); 
    Document doc = builder.parse(file); 

    NodeList nodes = doc.getElementsByTagName("topic"); 
    for (int i = 0; i < nodes.getLength(); i++) { 
    Element element = (Element) nodes.item(i); 
    NodeList title = element.getElementsByTagName("title"); 
    Element line = (Element) title.item(0); 
    System.out.println("Title: " + getCharacterDataFromElement(line)); 
    } 
} 
public static String getCharacterDataFromElement(Element e) { 
    Node child = e.getFirstChild(); 
    if (child instanceof CharacterData) { 
    CharacterData cd = (CharacterData) child; 
    return cd.getData(); 
    } 
    return ""; 
} 

(http://www.java2s.com/Code/Java/XML/GetcharacterdataCDATAfromxmldocument.htm)

+0

Prefiero hacer algo como: if (child! = Null && (instancia infantil de CharacterData)) { return ((CharacterData) child) .getData(); } else { return e.getNodeValue(); } Para manejar sin problemas la presencia/ausencia de bloque CDATA. –

+0

¿Puede proporcionar algún texto para describir lo que está haciendo y por qué usaría 'DocumentBuilderFactory'? – Gray

+0

En la implementación actual de DOM de Java, puede acceder a CDATA simplemente como datos de texto usando 'e.getTextContent()'. [Ver ejemplo] (http://stackoverflow.com/questions/42802202) sin verificación de tipo, lanzamiento, 'e.getData()'. – jschnasse

2

CDATA solo dice que los datos incluidos no se deben escapar. Entonces, solo toma el texto de la etiqueta. El analizador XML debe devolver los datos claros sin CDATA.

+1

obteniendo los datos de texto: e.getTextContent(); –

0

aquí r.get().getResponseBody() es el cuerpo de la respuesta

Document doc = getDomElement(r.get().getResponseBody());    
    NodeList nodes = doc.getElementsByTagName("Title"); 
    for (int i = 0; i < nodes.getLength(); i++) { 
    Element element = (Element) nodes.item(i); 
    NodeList title = element.getElementsByTagName("Child tag where cdata present"); 
    Element line = (Element) title.item(0); 
    System.out.println("Title: "+ getCharacterDataFromElement(line)); 


    public static Document getDomElement(String xml) { 
     Document doc = null; 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setCoalescing(true); 
     dbf.setNamespaceAware(true); 
     try { 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      InputSource is = new InputSource(); 
      is.setCharacterStream(new StringReader(xml)); 
      doc = db.parse(is); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return doc; 
    } 

    public static String getCharacterDataFromElement(Element e) { 
     Node child = e.getFirstChild(); 
     if (child instanceof CharacterData) { 
      CharacterData cd = (CharacterData) child; 
      return cd.getData(); 
     } 
     return ""; 
    } 
1

Puesto que todas las respuestas anteriores están utilizando un enfoque basado en DOM. Esta es la forma de analizar CDATA con un enfoque basado en flujo usando STAX.

Utilice el siguiente patrón:

switch (EventType) { 
     case XMLStreamConstants.CHARACTERS: 
     case XMLStreamConstants.CDATA: 
      System.out.println(r.getText()); 
      break; 
     default: 
      break; 
     } 

muestra completa:

import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.InputStream; 

import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamConstants; 
import javax.xml.stream.XMLStreamReader; 

public void readCDATAFromXMLUsingStax() { 
    String yourSampleFile = "/path/toYour/sample/file.xml"; 
    XMLStreamReader r = null; 
    try (InputStream in = 
      new BufferedInputStream(new FileInputStream(yourSampleFile));) { 
     XMLInputFactory factory = XMLInputFactory.newInstance(); 
     r = factory.createXMLStreamReader(in); 
     while (r.hasNext()) { 
      switch (r.getEventType()) { 
      case XMLStreamConstants.CHARACTERS: 
      case XMLStreamConstants.CDATA: 
       System.out.println(r.getText()); 
       break; 
      default: 
       break; 
      } 
      r.next(); 
     } 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } finally { 
     if (r != null) { 
      try { 
       r.close(); 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 
} 

Con /path/toYour/sample/file.xml

<data> 
    <![CDATA[ Sat Nov 19 18:50:15 2016 (1672822)]]> 
    <![CDATA[Sat, 19 Nov 2016 18:50:14 -0800 (PST)]]> 
</data> 

Da:

Sat Nov 19 18:50:15 2016 (1672822)        
Sat, 19 Nov 2016 18:50:14 -0800 (PST)