我有一个给定的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">
如果我针对模式online或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”)并且无需验证一切正常!
那么名称空间声明有什么问题吗?
答案 0 :(得分:1)
错误表明您的文档无效,因为没有定义具有本地名称request
和名称空间前缀invoice
的元素。您的实例文档具有针对相同名称空间URI的该前缀和模式位置提示的命名空间绑定,因此该部分似乎是正确的。
检查您的架构是否存在以下问题:
http://www.medidata.ch/QO/XSD
)request
)如果其中任何一项不正确,您的文档无效。 (您的架构或实例XML文档中可能还会出现其他问题,导致其无效。)
通常(如果您的XML文档真的有效),这样的问题是由以下两种原因之一引起的:
标记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文件作为名称空间感知处理。