【问题标题】:SAX Parser: Specify DTD location in appletSAX 解析器:在小程序中指定 DTD 位置
【发布时间】:2011-09-21 03:04:04
【问题描述】:

我有一个在小程序查看器中运行良好的小程序,但一旦播放到服务器,它就无法解析 XML 文件

原因很简单:SAX 解析器试图打开硬盘上的 dtd,而不是 JAR。

有人告诉我这样做:

可以很容易地形成资源的 URL 使用 URL(baseURL, pathString) 基本 URL 所在的构造函数 从 Applet.getDocumentBase() 获得 或 Applet.getCodeBase()。

但我不知道如何在我的情况下应用它:

这是一个 XML 示例:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "leveldtd.dtd">   
<level>
...
</level>

这是我的解析器的初始化

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 示例有一个“注释”文档类型 (&lt;!DOCTYPE note),根元素是 level
  • 这有什么问题? (我的 xml 是完全定制的,用于存储我的游戏关卡,不遵守特定规范,dtd 只是为了确保数据格式正确)
  • 文档类型中的名称必须与根元素匹配,否则无效。我不确定如何根据 DTD 验证 XML 并且不会出错。来自“w3.org/TR/xml/#sec-prolog-dtd”:Validity constraint: Root Element Type - The Name in the document type declaration MUST match the element type of the root element.

标签: java xml sax dtd japplet


【解决方案1】:

如果不需要验证,您可以在 SAXParserFactory.setValidating() 中将其关闭,这样解析器就不会尝试读取 DTD。

如果您确实需要验证,您可以通过在 sax 解析器上设置您自己的 EntityResolver 来重定向任何 DTD/XSD 请求。

【讨论】:

  • 它是我正在考虑的一个选项,因为所有的 xml 格式都正确,我更愿意了解如何设置验证 ^^
猜你喜欢
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2023-03-13
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多