Апплет: XML не может найти DTD - PullRequest
2 голосов
/ 21 июня 2011

Я пишу апплет, который использует файл DTD для проверки содержимого получаемого XML.

У меня была проблема с DTD, не помещенным в нужную папку с программой просмотра апплета, но теперь, когда я тестирую это на сервере, я снова получаю ту же ошибку.

java.security.AccessControlException: 
    access denied (java.io.FilePermission/leveldtd.dtd read)

Как это исправить, когда апплет находится на сервере?


public static void parseThis(InputSource is) throws Exception{
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLHandlerLevel myExampleHandler = new XMLHandlerLevel();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(myExampleHandler);
        /* Begin parsing */ 
        xr.parse(is);
    }

Создание XML-парсера.

1 Ответ

3 голосов
/ 21 июня 2011

Чтобы апплет получил ресурс с сервера, он должен использовать URL. Файловые объекты не будут работать, потому что:

  1. Объект File будет указывать на место на компьютере пользователя .
  2. Для использования File объектов требуется доверенный апплет. Отсюда AccessControlException в вашем выводе.

URL-адреса ресурсов могут быть легко сформированы с помощью конструктора URL(baseURL, pathString), где базовый URL-адрес получен из Applet.getDocumentBase() или Applet.getCodeBase().

.. как дать URL парсеру?

Вот фрагмент кода, взятый из JaNeLA , в котором используется XSD, расположенный внутри одного из банок. URL хранится в schemaSource.

try {
    URL schemaSource = Thread.currentThread().getContextClassLoader().getResource("JNLP-6.0.xsd");
    System.out.println( "schemaSource: " + schemaSource );

    DocumentBuilderFactory factory =
        DocumentBuilderFactory.newInstance();
    factory.setFeature("http://xml.org/sax/features/validation", true);
    factory.setFeature("http://apache.org/xml/features/validation/schema", true) ;
    factory.setFeature("http://xml.org/sax/features/namespaces", true) ;
    factory.setFeature("http://apache.org/xml/features/validation/schema-full-checking", true);
    factory.setAttribute(
        "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
        schemaSource.toString());
    factory.setNamespaceAware(true);
    factory.setValidating(true);

    InputStream schemaStream = schemaSource.openStream();
    try {
        StreamSource ss = new StreamSource( schemaStream );
        String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
        SchemaFactory schemaFactory = SchemaFactory.newInstance(language);

        Schema schema = schemaFactory.newSchema(ss);
        factory.setSchema( schema );
    }
    finally {
        schemaStream.close();
    }

    DocumentBuilder documentBuilder = factory.newDocumentBuilder();
    documentBuilder.setErrorHandler( errorHandler );

    InputStream is = page.openStream();
    try {
        document = documentBuilder.parse( is );
    }
    finally {
        is.close();
    }

    List<LaunchError> parseErrors = errorHandler.getParseErrors();
    xmlValid = parseErrors.isEmpty();
    errors.addAll(parseErrors);
} catch(Exception e) {
    System.err.println( "Error: " + e.getMessage() );
    // TODO Show to user
}
...