2011-01-24 8 views
5

Trong file XML của tôi, tôi có một số đơn vị như ’Sử dụng JDOM để phân tích tập tin XML với DTD bên ngoài mà chưa được khai báo trong file XML

Vì vậy, tôi đã tạo ra một thẻ DTD cho tài liệu XML của tôi để xác định các thực thể. Dưới đây là mã Java được sử dụng để đọc tệp XML.

SAXBuilder builder = new SAXBuilder(); 
URL url = new URL("http://127.0.0.1:8080/sample/subject.xml");   
InputStream stream = url.openStream(); 
org.jdom.Document document = builder.build(stream); 

Element root = document.getRootElement(); 

Element name = root.getChild("name"); 
result = name.getText(); 
System.err.println(result);

Làm cách nào để thay đổi mã Java để truy xuất DTD qua HTTP để cho phép phân tích cú pháp tài liệu XML của tôi không bị lỗi?

Ví dụ đơn giản về tài liệu xml.


<main> 
    <name>hello &lsquo; world &rsquo; foo &amp; bar </name> 
</main> 
+1

Đối tượng phải được khai báo trước khi chúng có thể được sử dụng. Nếu bạn đang sử dụng các tham chiếu thực thể chưa được khai báo (nằm trong tệp hoặc có tham chiếu đến một DTD bên ngoài), bạn có tệp XML không hợp lệ. –

+1

Thật vậy. Vấn đề của tôi là tiêm đường dẫn đến DTD của tôi vào xml khi chạy, vì dtd không được tham chiếu bên trong tài liệu xml. DTD nằm trên một máy chủ từ xa có thể truy cập thông qua http. –

Trả lời

3

Một cách để làm điều này sẽ được đọc các tài liệu và sau đó xác nhận nó với máy biến áp:

import java.net.URL; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 
import org.xml.sax.SAXException; 
import org.xml.sax.SAXParseException; 

public class ValidateWithExternalDTD { 
    private static final String URL = "http://127.0.0.1:8080/sample/subject.xml"; 
    private static final String DTD = "http://127.0.0.1/YourDTD.dtd"; 

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

      // Set the error handler 
      builder.setErrorHandler(new org.xml.sax.ErrorHandler() {     
       public void fatalError(SAXParseException spex) 
         throws SAXException { 
        // output error and exit 
        spex.printStackTrace(); 
        System.exit(0); 
       } 

       public void error(SAXParseException spex) 
         throws SAXParseException { 
        // output error and continue 
        spex.printStackTrace(); 
       } 

       public void warning(SAXParseException spex) 
         throws SAXParseException { 
        // output warning and continue 
        spex.printStackTrace(); 
       } 
      }); 

      // Read the document 
      URL url = new URL(ValidateWithExternalDTD.URL); 
      Document xmlDocument = builder.parse(url.openStream()); 
      DOMSource source = new DOMSource(xmlDocument); 

      // Use the tranformer to validate the document 
      StreamResult result = new StreamResult(System.out);      
      TransformerFactory tf = TransformerFactory.newInstance(); 
      Transformer transformer = tf.newTransformer(); 
      transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, ValidateWithExternalDTD.DTD); 
      transformer.transform(source, result); 

      // Process your document if everything is OK 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Một cách khác là để thay thế cho danh hiệu XML với tiêu đề XML cộng với tài liệu tham khảo DTD

Thay thế này:

<?xml version = "1.0"?> 

với điều này:

<?xml version = "1.0"?><!DOCTYPE ...> 

Tất nhiên bạn sẽ thay thế sự xuất hiện đầu tiên duy nhất và không cố gắng để đi qua các tài liệu toàn xml

Bạn cần phải nhanh chóng SAXBuilder bằng cách đi qua đúng (validate) để constructor của nó:

SAXBuilder builder = new SAXBuilder(true); 

hoặc gọi số:

builder.setValidation(true) 
+1

Kích thước XML lớn cỡ nào? – DaTroop

+1

Kích thước XML lớn đến mức nào? Tôi có thể có một XML mẫu không? Tài liệu XML có luôn chứa một tiêu đề XML không? – DaTroop

+0

Tôi đang sử dụng JDOM như trái ngược với W3C DOM: ( –