Applet:XML无法找到DTD

时间:2011-06-21 16:41:41

标签: java xml applet dtd

我正在编写一个使用DTD文件检查其收到的XML内容的applet。

我遇到的问题是DTD没有放在applet viewer的正确文件夹中,但现在我在服务器上测试了这个问题,我再次遇到同样的错误。

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 个答案:

答案 0 :(得分:3)

要让applet从服务器获取资源,它必须使用URL。文件对象不起作用,因为:

  1. File对象将指向用户计算机上的某个位置。
  2. 它需要一个受信任的applet才能使用File个对象。因此输出中的AccessControlException
  3. 可以使用URL(baseURL, pathString)构造函数轻松构建资源的网址,其中基本网址来自Applet.getDocumentBase()Applet.getCodeBase()

      

    ..如何将URL提供给解析器?

    以下是取自JaNeLA的代码段,该代码段使用位于其中一个Jars中的XSD。该网址存储在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
    }