我正在使用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类。
答案 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
。