2013-04-28 5 views
0

В чем разница между (фокус на префиксов ч :, C :, а: и по умолчанию):Импортные схемы и пространства имен

<?xml version="1.0" encoding="UTF-8"?> 
<xmlBoo xmlns="http://www.example.org/boo" 
     xmlns:c="http://www.example.org/customer" 
     xmlns:a="http://www.example.org/address" 
     xmlns:h="http://www.example.org/header"> 
    <h:header> 
     <h:id>101</h:id> 
    </h:header> 
    <c:customer> 
     <c:id>1</c:id> 
     <c:name>John</c:name> 
     <a:address> 
     <a:street>Long street</a:street> 
     </a:address> 
    </c:customer> 
    <someBooSpecificField>Specific data in Boo</someBooSpecificField> 
</xmlBoo> 

и

<?xml version="1.0" encoding="UTF-8"?> 
<xmlBoo xmlns="http://www.example.org/boo" 
     xmlns:c="http://www.example.org/customer" 
     xmlns:a="http://www.example.org/address" 
     xmlns:h="http://www.example.org/header"> 
    <header> 
     <h:id>101</h:id> 
    </header> 
    <customer> 
     <c:id>1</c:id> 
     <c:name>John</c:name> 
     <address> 
     <a:street>Long street</a:street> 
     </address> 
    </customer> 
    <someBooSpecificField>Specific data in Boo</someBooSpecificField> 
</xmlBoo> 

Я спрашиваю, потому что Я реализовал отображение через JAXB, а marshaller создал первый xml. Но когда я добавляю проверки схемы я получаю исключение:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'ns3:header'. One of '{"http://www.example.org/boo":header}' is expected. 

Похоже, что валидатор ожидает (на основе схемы) второй XML.

Какой префикс должен быть перед заголовком элемента? По умолчанию (связанный с пространством имен [http://www.example.org/boo]) или h: (связанный с пространством имен [http://www.example.org/header]).

Я думал, что весь заголовок элемента полностью соединен с h: не только его подэлементы, как во втором примере. Каковы наилучшие практики, что объясняет это.

Моя XML-схема:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:h="http://www.example.org/header" 
      xmlns:c="http://www.example.org/customer" 
      targetNamespace="http://www.example.org/boo" 
      elementFormDefault="qualified"> 

    <xsd:import namespace="http://www.example.org/header" schemaLocation="header.xsd"/> 
    <xsd:import namespace="http://www.example.org/customer" schemaLocation="customer.xsd"/> 

    <xsd:element name="xmlBoo"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="header" type="h:header"/> 
       <xsd:element name="customer" type="c:customer"/> 
       <xsd:element name="someBooSpecificField" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

и, например. header.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://www.example.org/header" 
      elementFormDefault="qualified"> 

    <xsd:complexType name="header"> 
     <xsd:sequence> 
      <xsd:element name="id" type="xsd:long"/> 
     </xsd:sequence> 
    </xsd:complexType> 

</xsd:schema> 

ответ

2

Второй пример XML верен, как указано в валидации схемы.

Я думаю, что вы путаете пространство имен типа с пространством имен элемента. Строка < xsd: element name = "header" type = "h: header" > в вашей схеме определяет элемент с именем "header" в пространстве имен по умолчанию, который имеет тип "header" в пространстве имен "http://www.example.org/header".

Рассмотрим, как XML будет выглядеть, если линия была вместо < XSD: имя элемента = тип «MYHEADER» = «ч: заголовок» >

+0

Вы совершенно правы, спасибо. – Ziletka

+0

хороший наконечник, thx! +1 – JBA