2008-10-28 32 views

Trả lời

18

Bạn sẽ có thể chỉ định EntityResolver của riêng mình hoặc sử dụng các tính năng cụ thể của trình phân tích cú pháp của mình? Xem here để biết một số cách tiếp cận.

Một ví dụ hoàn chỉnh hơn:

<?xml version="1.0"?> 
<!DOCTYPE foo PUBLIC "//FOO//" "foo.dtd"> 
<foo> 
    <bar>Value</bar> 
</foo> 

Và xpath sử dụng:

import java.io.File; 
import java.io.IOException; 
import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.xml.sax.EntityResolver; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 

     builder.setEntityResolver(new EntityResolver() { 

      @Override 
      public InputSource resolveEntity(String publicId, String systemId) 
        throws SAXException, IOException { 
       System.out.println("Ignoring " + publicId + ", " + systemId); 
       return new InputSource(new StringReader("")); 
      } 
     }); 
     Document document = builder.parse(new File("src/foo.xml")); 
     XPathFactory xpathFactory = XPathFactory.newInstance(); 
     XPath xpath = xpathFactory.newXPath(); 
     String content = xpath.evaluate("/foo/bar/text()", document 
       .getDocumentElement()); 
     System.out.println(content); 
    } 
} 

Hope this helps ...

+0

Cảm ơn, điều này làm giảm một số kiểm tra đơn vị tôi đang làm với hệ số 7. –

2

Tôi có vấn đề này trước đó. Tôi đã giải quyết nó bằng cách tải xuống và lưu trữ một bản sao cục bộ của DTD và sau đó xác thực đối với bản sao cục bộ. Bạn cần chỉnh sửa tệp XML để trỏ tới bản sao cục bộ.

<!DOCTYPE root-element SYSTEM "filename"> 

Ít biết thêm ở đây: http://www.w3schools.com/dtd/dtd_intro.asp

Tôi nghĩ bạn cũng có thể tự thiết lập một số loại tài sản validateOnParse là "false" trong phân tích cú pháp của bạn. Phụ thuộc vào thư viện bạn đang sử dụng để phân tích cú pháp XML. Thông tin

More đây: http://www.w3schools.com/dtd/dtd_validation.asp

13

này đã làm việc cho tôi:

SAXParserFactory saxfac = SAXParserFactory.newInstance(); 
    saxfac.setValidating(false); 
    try { 
    saxfac.setFeature("http://xml.org/sax/features/validation", false); 
    saxfac.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
    saxfac.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
    saxfac.setFeature("http://xml.org/sax/features/external-general-entities", false); 
    saxfac.setFeature("http://xml.org/sax/features/external-parameter-entities", false); 
    } 
    catch (Exception e1) { 
    e1.printStackTrace(); 
    } 
+3

1 - Đây là câu trả lời tốt nhất ở đây - tuy nhiên chỉ đủ dùng dòng này: '' saxfac.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); '' –

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