Xjc在xml的xSD属性定义上抛出“无效的属性值,而不是有效的NCName”:xsi和xsi:noNamespaceSchemaLocation

时间:2015-09-15 18:50:35

标签: java xml xsd jaxb

我正在使用xjc来创建JAXB类。我使用以下命令

xjc -d src -p com.abc.proj the-types.xsd

我收到以下错误

parsing a schema...
[ERROR] s4s-att-invalid-value: Invalid attribute value for 'name' in element 'attribute'. Recorded reason: cvc-datatype-valid.1.2.1: 'xmlns:xsi' is not a valid value for 'NCName'.
  line 106 of file:/C:/Port/Field/the-types.xsd

[ERROR] src-attribute.3.1: One of 'ref' or 'name' must be present in a local attribute declaration.
  line 106 of file:/C:/Port/Field/the-types.xsd

[ERROR] s4s-att-invalid-value: Invalid attribute value for 'name' in element 'attribute'. Recorded reason: cvc-datatype-valid.1.2.1: 'xsi:noNamespaceSchemaLocation' is not a valid value for 'NCName'.
  line 107 of file:/C:/Port/Field/the-types.xsd

[ERROR] src-attribute.3.1: One of 'ref' or 'name' must be present in a local attribute declaration.
  line 107 of file:/C:/Port/Field/the-types.xsd

Failed to parse a schema.

以-**.xdd文件的** <xs:attribute name="" ..> **开头的第106行和第107行给出错误。 .xsd文件是:

<?xml version="1.0" encoding="UTF-8"?>
   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

         <xs:element name="the-types">
               <xs:complexType>
                     <xs:sequence>
                           <xs:element name="AType" maxOccurs="unbounded">

                            ...............


                           </xs:element>
                     </xs:sequence>
                     **<xs:attribute name="xmlns:xsi" type="xs:string"></xs:attribute>
                     <xs:attribute name="xsi:noNamespaceSchemaLocation" type="xs:string"></xs:attribute>**
               </xs:complexType>
         </xs:element>
   </xs:schema>

我从名称中不能使用的链接Invalid attribute value for 'name' in element 'element'中了解到的内容。但这没有用。我应该如何更改我的xsd才能获得JAXB类。

2 个答案:

答案 0 :(得分:3)

您尝试创建的属性不正确。属性的名称必须是NCName(即非殖民名称),因此无法使用您拥有的值(有关详细信息,请参阅here)。查看您尝试定义的属性,我可以告诉您,您不需要在架构中定义这些属性。那是因为它们已经在其他模式中定义(在本例中是XML模式实例模式)。因此,可以将这些属性添加到XML文档中。像这样:

<the-types>
   <AType xsi:schemaLocation="location.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</the-types>

答案 1 :(得分:2)

  

[错误] s4s-att-invalid-value:&#39; name&#39;的属性值无效在元素&#39;属性&#39;。记录原因:cvc-datatype-valid.1.2.1:&#39; xmlns:xsi&#39;不是&#39; NCName&#39;。

的有效值
<xs:attribute name="xmlns:xsi" type="xs:string"></xs:attribute>
<xs:attribute name="xsi:noNamespaceSchemaLocation" type="xs:string"></xs:attribute>

这确实不合法。你似乎在尝试两件事:

  • 定义属性xmlns:xsi。这不是一个属性(虽然它看起来像一个)。以xmlns:开头的任何内容都是名称空间声明,并为其后面的前缀定义名称空间。
  • 定义属性xsi:noNamespaceSchemaLocation。这是为XSI保留的,不应在XSD中单独指定。当您需要此属性来定义XSD的无命名空间元素的位置时,只需在您想要使用它时定义XSI命名空间。

您不需要申报其中任何一项。它们神奇地存在,并且所有符合标准的XSD验证器都能理解它们。它们是保留的(虽然允许声明XSI属性,但您不应该尝试,因为它可能会覆盖标准行为,但更可能的是,它将被忽略

错误声称它们不是NCName。那是正确的。并且NCName不包含冒号。这意味着,您只能定义名称的本地部分。

更新(忘了你的最后一行)

  

但这并没有帮助。我应该如何更改我的xsd才能获得JAXB类。

确保您的XSD有效(通过删除这些行来修复上述两个错误),您应该没问题。您仍然可以使用这些属性,如果您这样做,JAXB将会理解它。实际上,JAXB 期望并要求您这样做,除非您在验证XML 时告诉它架构所在的位置。

如果您想了解命名空间如何与您的架构设计进行交互,那么有关XFront的这篇文章是一本很好的读物:Zero, One or Many namespaces。它将帮助您了解与XSD设计有关的命名空间概念,以及为什么只能在名称中使用NCName