如何使用旧的(1999)架构版本在JAXP中解析/验证XML?

时间:2010-11-04 20:37:03

标签: xml xsd xerces jaxp

我有一个XML模式,它是使用旧版本的XML规范(http://www.w3.org/1999/XMLSchema)构建的。我试图使用模式解析XML消息(如下所示)。默认情况下,Xerces 1.1解析器在应用程序域根目录中查找架构。我正在尝试将架构移动到我们的Web目录中的公共位置。看起来我不能使用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>

谢谢!

2 个答案:

答案 0 :(得分:0)

使用旧版JAXP;也许1.6

答案 1 :(得分:0)

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

Xerces的后续版本(甚至在Xerces 2之前)似乎已经放弃了对1999架构规范的支持,转而支持2001架构规范。虽然,后来的Xerces版本似乎允许在模式文件的位置上提供更多的灵活性。