Xjc 对 xmlns:xsi 和 xsi:noNamespaceSchemaLocation 的 XSD 属性定义提出了"Invalid attribute value, not a valid N



我使用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.

以** <xs:attribute name="" ..> **开头的第106和107行。XSD文件给出错误。.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>

我从链接的理解'name'无效属性值In element'我们不能用:in the name。但这无济于事。我应该如何更改xsd以获得JAXB类呢?

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

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

[ERROR] s4s-at - Invalid -value:元素'attribute'中'name'的属性值无效。记录的原因:cvc-datatype- validate .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

相关内容

最新更新