2010-06-18 19 views
7

Tôi đang sử dụng thư viện rpc rpc dịch vụ web Apache để thực hiện yêu cầu đối với dịch vụ rpc. Một nơi nào đó trong quá trình đó là một tài liệu xml với tham chiếu DTD đến http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd, thư viện cố gắng tải xuống khi phân tích cú pháp XML. Tải xuống đó không thành công với mã trạng thái 503 vì w3c đang chặn tải xuống lặp lại tài liệu tĩnh này từ các máy khách Java.Sử dụng Danh mục XML có thư viện Java sử dụng JAXP trong nội bộ

Giải pháp là Danh mục XML để lưu cục bộ DTD. Tuy nhiên, trong khi tôi có thể tìm thấy các ví dụ về việc thiết lập một EntityHandler trên một cá thể JAXP SAXParser trực tiếp để cho phép hỗ trợ trình phân tích cú pháp danh mục, tôi thực sự không có quyền truy cập vào trình phân tích cú pháp cơ bản ở đây. Nó chỉ được sử dụng bởi thư viện rpc xml. Có cách nào tôi có thể thiết lập một tài sản toàn cầu hoặc một cái gì đó mà sẽ cho JAXP để sử dụng danh mục XML?

Trả lời

1

Tôi nghĩ bạn muốn thuộc tính hệ thống xml.catalog.files.

Hãy xem http://xml.apache.org/commons/components/resolver/resolver-article.html

BTW, đây là hit thứ ba trên một tìm kiếm Google cho jaxp catalog

+0

Tôi đã xem bài viết đó và tôi đã cố tích hợp xml-resolver vào dự án của mình. Vấn đề là thuộc tính hệ thống xml.catalog.files chỉ có ảnh hưởng khi bạn đã cài đặt Trình giải quyết XML làm trình phân giải đối tượng của bạn trên cá thể trình đọc JAXP của bạn. Vấn đề của tôi là tôi không có quyền truy cập đối tượng trình đọc JAXP được sử dụng nội bộ bởi thư viện dịch vụ web. –

+0

Nếu bạn đặt thuộc tính đó trên dòng lệnh khi khởi chạy chương trình, nhà máy phân tích cú pháp có nhận được "thấy" không? –

1

Thật không may, thiết xml.catalog.files KHÔNG có bất kỳ ảnh hưởng đến các nhà máy phân tích cú pháp. Lý tưởng nhất là nó nên, tất nhiên, nhưng cách duy nhất để sử dụng một trình phân giải là bằng cách nào đó thêm một phương thức đại biểu độ phân giải cho trình phân giải danh mục trong trình xử lý mà trình phân tích cú pháp SAX sử dụng.

Nếu bạn đang sử dụng một phân tích cú pháp SAX, đó là khá dễ dàng:

final CatalogResolver catalogResolver = new CatalogResolver(); 
    DefaultHandler handler = new DefaultHandler() { 
     public InputSource resolveEntity (String publicId, String systemId) { 
      return catalogResolver.resolveEntity(publicId, systemId); 
     } 
     public void startElement(String namespaceURI, String lname, String qname, 
      Attributes attrs) { 
      // the stuff you'd normally do 
     } 
     ... 
    }; 

    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    SAXParser saxParser = factory.newSAXParser(); 
    String url = args.length == 0 ? "http://horstmann.com/index.html" : args[0]; 
    saxParser.parse(new URL(url).openStream(), handler); 

Nếu không, bạn sẽ cần phải tìm ra nếu bạn có thể cung cấp phân giải thực thể của riêng bạn. Với javax.xml.parsers.DocumentBuilder, bạn có thể. Với đối tượng scala.xml.XML, bạn không thể nhưng bạn có thể sử dụng subterfuge:

val res = new com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver 

val loader = new factory.XMLLoader[Elem] { 
    override def adapter = new parsing.NoBindingFactoryAdapter() { 
    override def resolveEntity(publicId: String, systemId: String) = { 
     res.resolveEntity(publicId, systemId) 
    } 
    } 
} 

val doc = loader.load(new URL("http://horstmann.com/index.html"))enter code here 
Các vấn đề liên quan