给定xsd / xml的SAXParseException代码cvc-elt.1

时间:2013-03-14 14:31:06

标签: xml xsd jaxb moxy

我有一个给定的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”)并且无需验证一切正常!

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

1 个答案:

答案 0 :(得分:1)

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

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

  1. 架构的目标命名空间是否与文档的根元素使用的命名空间相同(此处为http://www.medidata.ch/QO/XSD
  2. 是否存在与根元素具有相同本地名称的元素的全局元素声明(此处为request
  3. 如果您的根元素在具有名称空间前缀的模式中声明,那么该前缀是否绑定到文档中使用的相同名称空间URI
  4. 如果其中任何一项不正确,您的文档无效。 (您的架构或实例XML文档中可能还会出现其他问题,导致其无效。)

    通常(如果您的XML文档真的有效),这样的问题是由以下两种原因之一引起的:

    1. 找不到您的架构文档
    2. 元素名称被误解释,因为解析器未设置为名称空间感知
    3. 标记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文件作为名称空间感知处理。