2011-12-13 38 views
7

Cách phân tích cú pháp XML có dữ liệu được bao gồm trong <![CDATA[---]... cách chúng tôi có thể phân tích cú pháp xml và nhận dữ liệu được bao gồm trong CDATA ???Cách phân tích cú pháp XML cho <![CDATA[]]>

+0

Bạn có phân tích cú pháp Tệp "bằng tay" hoặc sử dụng cho bạn bất kỳ Lớp XMLReader nào không? – Thargor

Trả lời

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

Tôi thích làm điều gì đó như: if (child! = Null && (child instanceof CharacterData)) { return ((CharacterData) child) .getData(); } người khác { trả lại e.getNodeValue(); } Để xử lý liên tục sự hiện diện/vắng mặt của khối CDATA. –

+0

Bạn có thể vui lòng cung cấp một số văn bản để mô tả những gì bạn đang làm và tại sao bạn sẽ sử dụng 'DocumentBuilderFactory'? – Gray

+0

Trong triển khai Java DOM hiện tại, bạn có thể truy cập CDATA đơn giản dưới dạng dữ liệu văn bản bằng cách sử dụng 'e.getTextContent()'. [Xem ví dụ] (http://stackoverflow.com/questions/42802202) mà không cần kiểm tra kiểu, truyền, 'e.getData()'. – jschnasse

2

CDATA chỉ nói rằng dữ liệu được bao gồm sẽ không được thoát. Vì vậy, chỉ cần lấy văn bản thẻ. Trình phân tích cú pháp XML phải trả lại dữ liệu rõ ràng mà không cần CDATA.

+1

nhận dữ liệu văn bản: e.getTextContent(); –

0

đây r.get().getResponseBody() là cơ quan phản ứng

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

Vì tất cả các câu trả lời trước đang sử dụng một phương pháp tiếp cận dựa DOM. Đây là cách phân tích cú pháp CDATA bằng cách tiếp cận dựa trên luồng sử dụng STAX.

Sử dụng mô hình sau đây:

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

Toàn bộ mẫu:

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

Với /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> 

Cung cấp:

Sat Nov 19 18:50:15 2016 (1672822)        
Sat, 19 Nov 2016 18:50:14 -0800 (PST)  
Các vấn đề liên quan