我正在编写一个使用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解析器。
答案 0 :(得分:3)
要让applet从服务器获取资源,它必须使用URL。文件对象不起作用,因为:
File
对象将指向用户计算机上的某个位置。 File
个对象。因此输出中的AccessControlException
。可以使用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
}