Java Xjc抛出;无效的属性值,不是有效的NCName“;关于xmlns:xsi和xsi:noNamespaceSchemaLocation的XSD属性定义

Java Xjc抛出;无效的属性值,不是有效的NCName“;关于xmlns:xsi和xsi:noNamespaceSchemaLocation的XSD属性定义,java,xml,xsd,jaxb,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

我正在使用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.
-types.xsd文件中以**
**开头的第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>

...............
**
**
我从链接中了解到,我们不能使用:以名称。但这没用。如何更改xsd以获得JAXB类

[错误]s4s att无效值:元素“attribute”中“name”的属性值无效。记录原因:cvc数据类型有效。1.2.1:“xmlns:xsi”不是“NCName”的有效值

<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上的这篇文章是一本很好的读物:。它将帮助您理解与XSD设计有关的命名空间概念,以及为什么只能在名称中使用
NCName

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

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


其中一个甚至不是属性,根本无法定义。没错。xsi将是一个名称空间声明。这个问题很难回答,因为@Pan试图做什么还不清楚。也许他从其他地方收到了他的XSD,这种情况经常发生:你只是想从模式中创建POCO或POJO,然后你被一个错误击中,不知道下一步该做什么。谢谢。将尝试修改xsd。