2013-12-09 3 views
0

У меня есть два допустимых файла XSD (a.xsd и b.xsd). Я пытаюсь проверить XML-файл (example.xml) на схему и получить сообщение об ошибке.XSD XML - ошибка проверки при использовании ограничения

Может кто-нибудь объяснить мне, почему я получаю ошибку проверки?

ТНХ


a.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://namespace/a" xmlns:a="http://namespace/a" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="A"> 
    <xs:sequence> 
     <xs:element name="E1" type="xs:token" form="unqualified"/> 
     <xs:element name="E2" type="xs:token" form="unqualified" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

b.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://namespace/b" xmlns:b="http://namespace/b" xmlns:a="http://namespace/a" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:import namespace="http://namespace/a" schemaLocation="a.xsd"/> 
    <xs:element name="START" type="b:B"/> 
    <xs:complexType name="B"> 
    <xs:complexContent> 
     <xs:restriction base="a:A"> 
     <xs:sequence> 
      <xs:element name="E1"> 
      <xs:simpleType> 
       <xs:restriction base="xs:token"> 
       <xs:enumeration value="value1"> 
        <xs:annotation> 
        <xs:appinfo> 
         <codeName>value1</codeName> 
        </xs:appinfo> 
        </xs:annotation> 
       </xs:enumeration> 
       <xs:enumeration value="value2"> 
        <xs:annotation> 
        <xs:appinfo> 
         <codeName>value2</codeName> 
        </xs:appinfo> 
        </xs:annotation> 
       </xs:enumeration> 
       <xs:enumeration value="value3"> 
        <xs:annotation> 
        <xs:appinfo> 
         <codeName>value3</codeName> 
        </xs:appinfo> 
        </xs:annotation> 
       </xs:enumeration> 
       </xs:restriction> 
      </xs:simpleType> 
      </xs:element> 
     </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

example.xml

<?xml version="1.0" encoding="UTF-8"?> 
<b:START xmlns="http://namespace/a" xmlns:b="http://namespace/b" xsi:schemaLocation="http://namespace/b C:\problem\b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <E1>value1</E1> 
</b:START> 
+0

Я также хочу сгенерировать Java-классы через JAXB (без маршала и маршала) с помощью этих XSD. Если принять решение от Petru с пустым пространством имен, содержимое из E1 не будет отображено в класс Java, потому что определение из a.xsd является тем, что E1 принадлежит пространству имен http: // namespace/a ... – user3083431

ответ

2

Это декларация xmlns="http://namespace/a" в вашем образце XML, который бросает свой XML прочь ... И это потому, что ваш a.xsd использует атрибут form="unqualified"/ для определения E1 и E2.

Эффект этого атрибута заключается в том, что он отрицает пространство имен для вашего элемента, то есть эти элементы не должны иметь пространства имен - они не являются квалифицированными.

Чтобы исправить XML у вас есть два варианта, на основе вашего образца:

Удалите xmlns="http://namespace/a" из корневого элемента:

<?xml version="1.0" encoding="UTF-8"?> 
<b:START xmlns:b="http://namespace/b" xsi:schemaLocation="http://namespace/b b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <E1>value1</E1> 
</b:START> 

ИЛИ добавить Xmlns = "" к вашему элементу E1:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<START xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://namespace/a" xmlns="http://namespace/b"> 
    <E1 xmlns="">value1</E1> 
</START> 

Могут быть другие варианты, но в конечном итоге вышеизложенное необходимо понять, как в конечном итоге переопределить на уровне элемента пространство имен (в основном, область охвата).

+0

+1. @ user3083431: Не забудьте [** принять ответ Петру **] (http://meta.stackexchange.com/q/5234/234215), если он вам помог. Благодарю. – kjhughes

+0

Хорошо, понял ... следующий вопрос: Что нужно изменить в XSD, чтобы использовать их для JAXB (маршал/unmarshal)? Поскольку в сгенерированных классах элемент E1 находится в пространстве имен '' http: // namespace/a '', то что происходит с ошибкой проверки. – user3083431

+1

@ user3083431, вы должны создать новый вопрос и пометить его «jaxb» (в дополнение к любым другим тегам, которые вы можете захотеть). Не забудьте добавить сведения о настройке JAXB, например информацию о версии, соответствующие фрагменты сгенерированного кода и т. Д. –

Смежные вопросы