【问题标题】:Does a java SAX parser actually retrieve the DTD from the internet?java SAX 解析器是否真的从 Internet 检索 DTD?
【发布时间】:2018-03-14 16:26:21
【问题描述】:

对于声明 DOCTYPE 的 XML 文件,以 struts.xml 文件为例:

Java SAX 处理是否真的从提供的 URL 获取 dtd?

【问题讨论】:

    标签: java xml struts2 sax dtd


    【解决方案1】:

    即使从技术上讲,如果我没记错的话,许多(大多数)实现都会将位置解释为 URI,而不是 URL。

    如果您想确保在本地解决它,请查看EntityResolver 接口。

    【讨论】:

    • 那么,它会在互联网之前在哪里找到 dtd?我的意思是,文档类型引用是一个 http url;是否有将其转换为类路径查找的逻辑?我注意到 struts jar 里面都有 dtd。
    • 好吧,在互联网出现之前,DTD 并不存在 :-) 无论如何,doctype 引用看起来像一个 http URL,但这只是惯例——它实际上是一个 URI(有区别),并且确实不一定映射到有效的 URL。我已经很多年没有使用 Struts,但我猜它包含 DTD 并使用 EntityResolver 在本地解析它们。
    【解决方案2】:

    基于Xerces documentation,当验证开启时,解析器可能会尝试从互联网下载文件。但我真的认为这可以从解析器更改为解析器,因为库可能会决定使用本地缓存、代理服务器或其他任何东西。

    【讨论】:

    • 我看到了。我找不到更多关于其他地方以及以什么顺序尝试找到 dtd 的细节。文件系统?类路径?
    • 我认为,由于这是一个实现细节,没有比源代码和调试器更好的文档
    【解决方案3】:

    您可以修改 struts.xml 以从类路径中的 struts2 核心 jar 加载 DTD 文件,而不是从 Internet 加载它

    来自

    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts 
    Configuration//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 
    

    改成

    <!DOCTYPE struts SYSTEM "struts-2.0.dtd">
    

    现在 sax 解析器从我放置的 /src 文件夹中加载了 struts-2.0.dtd 文件。

    这也是我修改后的休眠配置文件,它的工作方式略有不同。它直接从 JAR 加载 dtd 文件,不必将其物理放置在 src 文件夹中

    <!DOCTYPE hibernate-configuration SYSTEM "classpath://org/hibernate/hibernate-configuration-3.0.dtd">
    

    【讨论】:

      猜你喜欢
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      相关资源
      最近更新 更多