0

我有一个给定的 xsd 文件并给出了该文件的示例。xsd 与http://www.forum-datenaustausch.ch/hospitalinvoicerequest_400.xsd非常相似,但在根目录下多了一个元素。

问题是,如果我针对模式验证给定的 xml(使用 moxy 作为 JAXBCOntextFactory)我得到了这个错误:

enterCaused by: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 221; cvc-elt.1: Cannot find the declaration of element 'invoice:request'.

invoice:request 是 xml 开始的根元素:

<invoice:request role="production" xmlns:invoice="http://www.medidata.ch/QO/XSD" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.medidata.ch/QO/XSD QO_MDInvoiceRequest_400.xsd">

如果我在线或在 Eclipse中针对模式验证 xml (右键单击验证),一切正常。如果我将名称空间从

xmlns:invoice="http://www.medidata.ch/QO/XSD"

xmlns:invoice="http://www.xmlData.ch/xmlInvoice/XSD"

错误消失了-但由于附加元素,我得到了另一个错误。有了这个命名空间声明,我什至无法在没有验证的情况下读取内容:root 的 getter 返回 null。使用替代声明(“ http://www.xmlData.ch/xmlInvoice/XSD ”)并且没有验证一切正常!

那么名称空间声明有什么问题呢?

4

1 回答 1

1

该错误表明您的文档无效,因为没有定义具有本地名称request和命名空间前缀的元素invoice。您的实例文档具有该前缀的名称空间绑定和相同名称空间 URI 的架构位置提示,因此该部分似乎是正确的。

检查您的架构是否存在以下问题:

  1. 架构的目标命名空间是否与文档根元素使用的命名空间相同(此处http://www.medidata.ch/QO/XSD
  2. 是否存在与根元素具有相同本地名称的元素的全局元素声明(此处request
  3. 如果您的根元素在架构中使用命名空间前缀声明,那么该前缀是否绑定到您的文档中使用的相同命名空间 URI

如果其中任何一项不正确,则您的文件无效。(稍后在您的模式或实例 XML 文档中可能还会出现其他问题,使其无效。)

通常(如果您的 XML 文档确实有效)此类问题是由以下两个原因之一引起的:

  1. 找不到您的架构文档
  2. 元素名称被误解,因为解析器未设置为命名空间感知

标记xsi:schemaLocation="http://www.medidata.ch/QO/XSD QO_MDInvoiceRequest_400.xsd"定义命名空间中元素的模式http://www.medidata.ch/QO/XSD是从相对(文件)位置找到的QO_MDInvoiceRequest_400.xsd。因此,如果您没有明确告诉解析器它应该使用什么模式文档,它将从输入文档所在的同一文件夹中查找具有该名称的文件。

由于第二个原因,我无法提供任何好的帮助,因为我不熟悉 moxy,但是/并且我假设 moxy 总是将 XML 文件作为命名空间感知处理。

于 2013-03-14T16:44:51.590 回答