Xjc выдает недопустимое значение атрибута, недопустимое NCName в определениях атрибутов XSD для xmlns:xsi и xsi:noNamespaceSchemaLocation

Я использую 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.

Строки 106 и 107, начинающиеся с **<xs:attribute name="" ..>** файла-types.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>

Что я понимаю из ссылки Недопустимое значение атрибута для "имя" в элементе " element', который мы не можем использовать : в имени. Но это не помогает. Как мне изменить свой xsd, чтобы получить классы JAXB.


person Pan    schedule 15.09.2015    source источник


Ответы (2)


[ОШИБКА] s4s-att-invalid-value: Недопустимое значение атрибута для «имя» в элементе «атрибут». Записанная причина: cvc-datatype-valid.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 в именах.

person Abel    schedule 15.09.2015
comment
Спасибо. Попробую изменить xsd. - person Pan; 15.09.2015

Атрибуты, которые вы пытались создать, неверны. Имя атрибута должно быть NCName (т. е. неколонизированным именем), поэтому имеющиеся у вас значения нельзя использовать (см. здесь для получения дополнительной информации). Глядя на атрибуты, которые вы пытаетесь определить, я могу сказать, что вам не нужно определять их в своей схеме. Это потому, что они уже определены в других схемах (в данном случае в схеме экземпляра XML-схемы). Таким образом, эти атрибуты могут быть добавлены в XML-документ. Так:

<the-types>
   <AType xsi:schemaLocation="location.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</the-types>
person Simeon G    schedule 15.09.2015
comment
Один из них даже не является атрибутом и вообще не может быть определен. - person Abel; 15.09.2015
comment
Вот так. xsi будет объявлением пространства имен. На этот вопрос трудно ответить, потому что то, что пытается сделать @Pan, очень неясно. - person Simeon G; 15.09.2015
comment
Возможно, он получил свой XSD из другого места, это часто случается: вы просто хотите создать POCO или POJO из схемы, а затем вы получаете сообщение об ошибке, не зная, что делать дальше. - person Abel; 15.09.2015