我有一个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>
谢谢!
答案 0 :(得分:0)
使用旧版JAXP;也许1.6
答案 1 :(得分:0)
所以,我得出结论,使用1999架构规范是一个坏主意。支持1999架构规范的早期版本的Xerces解析器在模式可以驻留在磁盘上的位置似乎不灵活。我可能会把模式放在app server根目录中,直到我们可以让客户使用我们架构的更新版本。
Xerces的后续版本(甚至在Xerces 2之前)似乎已经放弃了对1999架构规范的支持,转而支持2001架构规范。虽然,后来的Xerces版本似乎允许在模式文件的位置上提供更多的灵活性。