2011-12-13 15 views

Odpowiedz

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

Wolałbym zrobić coś w stylu: if (child! = Null && (child instanceof CharacterData)) { return ((CharacterData) child) .getData(); } else { return e.getNodeValue(); } Aby płynnie obsługiwać obecność/brak bloku CDATA. –

+0

Czy możesz podać tekst opisujący to, co robisz i dlaczego używałbyś 'DocumentBuilderFactory'? – Gray

+0

W obecnej implementacji DOM DOM można uzyskać dostęp do CDATA po prostu jako dane tekstowe za pomocą 'e.getTextContent()'. [Zobacz przykład] (http://stackoverflow.com/questions/42802202) bez sprawdzania typu, cast, 'e.getData()'. – jschnasse

2

CDATA mówi tylko, że zawarte w nim dane nie powinny zostać usunięte. Więc po prostu weź tekst tagu. Analizator składni XML powinien zwracać czyste dane bez numeru CDATA.

+1

uzyskiwanie danych tekstowych: e.getTextContent(); –

0

tutaj r.get().getResponseBody() jest organem odpowiedź

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

Ponieważ wszystkie poprzednie odpowiedzi używasz DOM podejście oparte. W ten sposób można sparsować CDATA za pomocą podejścia opartego na strumieniu przy użyciu STAX.

kliknąć na poniższy wzór:

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

Kompletna próbka:

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

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

Daje:

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