【问题标题】:cvc-complex-type.2.4.a: invalid content was found starting with element 'ProcessDesc'. One of ProcessName expectedcvc-complex-type.2.4.a:发现以元素“ProcessDesc”开头的无效内容。预期的 ProcessName 之一
【发布时间】:2014-09-30 05:02:23
【问题描述】:

我正在通过 Validator 类验证我的 jaxb 对象。下面是我用来验证 jaxb 对象的代码。但是在验证它时,我收到了这个错误。

jc = JAXBContext.newInstance(obj.getClass());
source = new JAXBSource(jc, obj);
Schema schema = schemaInjector.getSchema();
Validator validator = schema.newValidator();
validator.validate(source);

错误(SAXParseException):cvc-complex-type.2.4.a:发现以元素“ProcessDesc”开头的无效内容。应为 ProcessName 之一

我不明白我在 xsd 中做错了什么导致了这个错误。我的 xsd 文件中定义的元素在下面,我收到了错误。

<xs:schema xmlns:cc="http://www.ms.com/cm.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ms.com/cm.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:complexType name="Process">
    <xs:sequence>
      <xs:element name="ProcessId" type="xs:int" />
      <xs:element name="ProcessName" type="xs:string" />
      <xs:element name="ProcessDesc" type="xs:string" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>

请帮我解决这个问题。谢谢。

【问题讨论】:

    标签: xml jaxb schema xsd


    【解决方案1】:

    XML 模式代码

    <xs:complexType name="Process">
      <xs:sequence>
        <xs:element name="ProcessId" type="xs:int" />
        <xs:element name="ProcessName" type="xs:string" />
        <xs:element name="ProcessDesc" type="xs:string" minOccurs="0" />
      </xs:sequence>
    </xs:complexType>
    

    描述了一些看起来应该像这样的 XML

    <proc> <!-- of type Process -->
      <ProcessId>123</ProcessId>
      <ProcessName>procA</ProcessName>
      <ProcessDesc>A funny process</ProcessDesc> <!-- this could be omitted -->
    <proc>
    

    但是你的 XML 数据看起来像

    <proc> <!-- of type Process -->
      <ProcessId>123</ProcessId>
      <ProcessDesc>A funny process</ProcessDesc>
      <!-- ... don't know what follows -->
    

    如果您不关心 Id、Name、Desc 的顺序,则必须更改 XML 模式。否则,您将不得不修复 XML(这更容易)。

    如果您认为“任何元素的顺序”是个好主意,请使用:

    <xs:complexType name="Process">
      <xs:all>
        <xs:element name="ProcessId" type="xs:int" />
        <xs:element name="ProcessName" type="xs:string" />
        <xs:element name="ProcessDesc" type="xs:string" minOccurs="0" />
      </xs:all>
    </xs:complexType>
    

    【讨论】:

    • 谢谢。这个解决方案节省了我很多时间。基本上我没有在我的 xml 中获取进程名称元素值。非常感谢。
    • 对我来说,这只是一个错字。这个答案有助于找出答案。谢谢
    【解决方案2】:

    此类错误是由于以下原因之一

    1. 元素名称输入错误。
    2. 正在尝试使用架构中未描述的元素。
    3. 元素的顺序不正确。
    4. 在根标记或父元素中声明的命名空间定义与元素中使用的前缀(或无前缀)不匹配。
    5. Java 对象在 XSD 中需要一个空字段

    【讨论】:

    • 很好的解释,在我的例子中是标签名称中难以察觉的额外字符。谢谢!
    【解决方案3】:

    如果使用序列,则必须保持每个元素的顺序

    定义和用法 序列元素指定子元素必须出现在序列中。每个子元素可以出现 0 到任意次数。

    here

    【讨论】:

      【解决方案4】:

      这是一个简单的 XSD 验证错误...w3c

      【讨论】:

        【解决方案5】:

        当您根据需要设置字段并且它在记录中为NULL 时,另一个选项是违反约束。检查您的XSDminOccurs 元素属性。

        【讨论】:

          【解决方案6】:

          我在 ITR Utility 软件中解决了这个问题(如 incomeTaxReturnUtilities 中所述)

          本部分的某些字段填写错误:

          如果填写,我们需要输入部分代码、日期等所有详细信息,否则未填写。

          【讨论】:

            猜你喜欢
            • 2018-03-04
            • 1970-01-01
            • 1970-01-01
            • 2020-10-31
            • 2011-07-07
            • 2019-01-26
            • 2018-12-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多