2011-12-13 2 views
7

Как разобрать XML, содержащий данные, включенные в <![CDATA[---]..., как мы можем разобрать xml и получить данные, включенные в CDATA ???Как разобрать XML для <![CDATA[]]>

+0

Вы разбираете файл «вручную» или используете какой-либо класс XMLReader (и который)? – Thargor

ответ

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

Я бы предпочел сделать что-то вроде: if (child! = Null && (дочерний экземпляр CharacterData)) { return ((CharacterData) child) .getData(); } else { return e.getNodeValue(); } Для беспрепятственного управления наличием/отсутствием блока CDATA. –

+0

Можете ли вы предоставить какой-то текст, чтобы описать, что вы делаете, и почему вы использовали бы «DocumentBuilderFactory»? – Gray

+0

В текущей реализации Java DOM вы можете получить доступ к CDATA просто как текстовые данные с помощью 'e.getTextContent()'. [См. Пример] (http://stackoverflow.com/questions/42802202) без проверки типа, cast, 'e.getData()'. – jschnasse

2

CDATA просто говорит, что включенные данные не должны быть экранированы. Итак, просто возьмите текст тега. Парсер XML должен вернуть четкие данные без CDATA.

+1

Получение текстовых данных: e.getTextContent(); –

0

здесь r.get().getResponseBody() это тело

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

ответ Поскольку все предыдущие ответы, используя подход, основанный DOM. Вот как разобрать CDATA с потоковым подходом, используя STAX.

Использование следующей схеме:

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

Полный образец:

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); 
      } 
     } 
    } 
} 

С /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> 

Дает:

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