【问题标题】:How can I parse/validate XML in JAXP using an old (1999) schema version?如何使用旧 (1999) 模式版本在 JAXP 中解析/验证 XML?
【发布时间】:2011-05-05 07:23:16
【问题描述】:

我有一个使用旧版 XML 规范 (http://www.w3.org/1999/XMLSchema) 构建的 XML 模式。我正在尝试使用架构解析 XML 消息(如下所示)。默认情况下,Xerces 1.1 解析器在应用程序域根目录中查找模式。我正在尝试将架构移动到我们网络目录中的公共位置。似乎我无法使用 Xerces 1.1 库在我的解析程序中将 URL 指定为模式位置。

所以我尝试升级我的程序以使用 JAXP DocumentBuilderFactory 及其 setSchema() 方法。这似乎找到了带有我提供的架构 URL 的架构,除了它给出解析错误,因为架构(大概)不符合规范的更高版本(例如,我收到错误,因为我的 Ticket 元素不将其成员包装在 xs:Sequence 中)。

我无法升级我的架构,因为目前我无法强制外部客户重写他们向我们发送消息的应用程序。

谁能告诉我如何使用 JAXP 成功地解析/验证使用老式版本的架构规范?或者,有没有办法告诉 Xerces 1.1 DOMParser 使用由 URL(不是文件位置)定义的模式?

以下是架构的示例:

<?xml version="1.0" encoding="UTF-8" ?>
<schema>
  <element name="Ticket">
     <complexType>
        <element ref="ID" />
        <element ref="User" />
     </complexType>
  </element>

  <element name="ID" type='string' />
  <element name="UserID" type='string' />
</schema>

XML 文档如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Ticket xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation='TicketSubmission.xsd'>
  <ID>2010:December2:Dec:12:05:33:245</ID> 
  <UserID>user123</UserID> 
</Ticket>

谢谢!

【问题讨论】:

    标签: xml xsd xerces jaxp


    【解决方案1】:

    所以,我得出的结论是,使用 1999 架构规范是个坏主意。支持 1999 模式规范的 Xerces 解析器的早期版本似乎在模式可以驻留在磁盘上的位置方面并不灵活。在我们可以让我们的客户使用更新版本的架构之前,我可能一直坚持将架构放在应用服务器根目录中。

    Xerces 的更高版本(甚至在 Xerces 2 之前)似乎放弃了对 1999 模式规范的支持,转而支持 2001 模式规范。虽然,更高版本的 Xerces 似乎允许架构文件的位置更加灵活。

    【讨论】:

    • 我又看了看,发现可以创建一个自定义的EntityResolver并设置在解析器上。覆盖 resolveEntity 方法允许您返回一个带有 systemId 的 InputSource,该 systemId 指向包含您要使用的架构的 URL 或文件。
    【解决方案2】:

    使用旧版的 JAXP;可能是 1.6

    【讨论】:

    • 感谢您的建议。我尝试在 1.x 行(晚于 1.1.1)中使用更新版本的 Xerces。我没有运气。更高版本似乎只支持 2001 架构版本,尽管它们在您可以将架构物理放置在磁盘上的位置方面更加灵活。
    猜你喜欢
    • 2011-07-07
    • 2010-12-05
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多