2011-11-10 49 views
10

Làm cách nào tôi có thể bỏ qua khai báo DTD khi phân tích tệp bằng thư viện XOM xml. Tệp của tôi có dòng sau:Bỏ qua DTD khi phân tích cú pháp XML

<?xml version="1.0"?> 
<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "NCBI_BlastOutput.dtd"> 
//rest of stuff here 

Và khi tôi cố gắng xây dựng() tài liệu của tôi, tôi nhận được ngoại lệ filenotfound cho tệp DTD. Tôi biết tôi không có tập tin này và tôi không quan tâm về nó, vì vậy làm thế nào nó có thể được gỡ bỏ khi sử dụng XOM?

Đây là một đoạn mã:

public BlastXMLParser(String filePath) { 
    Builder b = new Builder(false); 
    //not a good idea to have exception-throwing code in constructor 
    try { 

     _document = b.build(filePath); 
    } catch (ParsingException ex) { 
     Logger.getLogger(BlastXMLParser.class.getName()).log(Level.SEVERE,"err", ex); 
    } catch (IOException ex) { 
     // 
    } 

private Elements getBlastReads() { 
    Element root = _document.getRootElement(); 
    Elements rootChildren = root.getChildElements(); 

    for (int i = 0; i < rootChildren.size(); i++) { 
     Element child = rootChildren.get(i); 
     if (child.getLocalName().equals("BlastOutput_iterations")) { 

      return child.getChildElements(); 
     } 
    } 

    return null; 
} 
} 

tôi nhận được một NullPointerException tại dòng này:

Element root = _document.getRootElement(); 

Với dòng DTD lấy ra từ tập tin nguồn XML Tôi thành công có thể phân tích nó, nhưng điều này không phải là một lựa chọn trong hệ thống sản xuất cuối cùng.

+0

Bạn có thể hiển thị 'mã' được sử dụng để phân tích cú pháp không? – bbaja42

Trả lời

-4

Theo tài liệu của họ, đây là cách phân tích cú pháp tài liệu mà không cần xác thực.

try { 
    Builder parser = new Builder(); 
    Document doc = parser.build("http://www.cafeconleche.org/"); 
} 
catch (ParsingException ex) { 
    System.err.println("Cafe con Leche is malformed today. How embarrassing!"); 
} 
catch (IOException ex) { 
    System.err.println("Could not connect to Cafe con Leche. The site may be down."); 
} 

Nếu bạn muốn xác lược đồ XML, bạn phải gọi new Builder(true):

try { 
    Builder parser = new Builder(true); 
    Document doc = parser.build("http://www.cafeconleche.org/"); 
} 
catch (ValidityException ex) { 
    System.err.println("Cafe con Leche is invalid today. (Somewhat embarrassing.)"); 
} 
catch (ParsingException ex) { 
    System.err.println("Cafe con Leche is malformed today. (How embarrassing!)"); 
} 
catch (IOException ex) { 
    System.err.println("Could not connect to Cafe con Leche. The site may be down."); 
} 

chú ý Pay mà bây giờ chưa một ngoại lệ có thể được ném: ValidityException

+1

Hãy xem đoạn mã của tôi.Even theo những gì được viết trong tài liệu Tôi không thể làm điều này để hoạt động – LordDoskias

13

Các giải pháp ưu tiên sẽ được thực hiện một EntityResolver ngăn chặn các yêu cầu cho DTD và chuyển hướng chúng đến một bản sao được nhúng. Nếu bạn

  1. không có quyền truy cập vào các DTD và
  2. là hoàn toàn chắc chắn bạn sẽ không cần đến nó (ngoài xác nhận nó cũng có thể tuyên bố tổ chức nhân vật được sử dụng trong tài liệu) và
  3. bạn đang sử dụng triển khai Parser XML Xerces

bạn có thể vô hiệu hóa việc tìm nạp DTD bằng cách đặt tính năng SAX tương ứng. Trong XOM, bạn có thể thực hiện điều này bằng cách chuyển một số XMLReader tới hàm tạo Builder như sau:

import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.XMLReaderFactory; 

... 

XMLReader xmlreader = XMLReaderFactory.createXMLReader(); 
xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
Builder builder = new Builder(xmlreader); 
+0

hoạt động này nếu không xmlreader của tôi bị treo vĩnh viễn sau khi thấy tuyên bố DOCTYPE –

Các vấn đề liên quan