2017-01-03 6 views
0

Я хочу иметь абстрактный класс (в качестве примера «транспортные средства») и хочу извлечь из него другие классы (например, «автомобиль» и «мотоцикл»).Вывод из абстрактного класса и ссылки только на производные классы

Теперь я хочу ссылаться на абстрактный класс в моем основном элементе, так что в xml-файле разрешено использовать только каждый производный класс из «транспортных средств». Я просто не знаю, как это сделать, любая помощь будет оценена по достоинству.

Пример XML:

<main xmlns="http://www.exampleURI.com/example"> 
    <car> 

    </car> 
    <motorbike> 

    </motorbike> 
</main> 

Пример XSD:

<?xml version="1.0"?> 
<xs:schema targetNamespace="http://www.exampleURI.com/example" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ex="http://www.exampleURI.com/example"> 
    <xs:element name="main" type="ex:main"/> 
    <xs:complexType name="main"> 
     <xs:sequence> 
      <xs:element name="vehicles" type="ex:vehicles"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="vehicles" type="ex:vehicles"/> 
    <xs:complexType name="vehicles" abstract="true"> 
     <xs:sequence/> 
    </xs:complexType> 
    <xs:element name="car" type="ex:car"/> 
    <xs:complexType name="car"> 
     <xs:complexContent> 
      <xs:extension base="ex:vehicles"> 
       <xs:sequence/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:element name="motorbike" type="ex:motorbike"/> 
    <xs:complexType name="motorbike"> 
     <xs:complexContent> 
      <xs:extension base="ex:vehicles"> 
       <xs:sequence/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 
+0

Пожалуйста показать схемы XML документ, который вы написали до сих пор. Благодарю. –

+0

Вещь iam делает это визуально в Enterprise Architect в данный момент, но я могу показать сгенерированный код из него. Одна секунда. – Cyriac

ответ

1

Похоже, замещающих групп будет делать трюк. Кроме того, внутри main вам необходимо использовать атрибут ref, чтобы убедиться, что правый элемент указан, и разрешить неограниченное количество детей.

<?xml version="1.0"?> 
<xs:schema targetNamespace="http://www.exampleURI.com/example" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ex="http://www.exampleURI.com/example"> 
    <xs:element name="main" type="ex:main"/> 
    <xs:complexType name="main"> 
     <xs:sequence> 
      <xs:element ref="ex:vehicles" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="vehicles" type="ex:vehicles"/> 
    <xs:complexType name="vehicles" abstract="true"> 
     <xs:sequence/> 
    </xs:complexType> 
    <xs:element name="car" type="ex:car" substitutionGroup="ex:vehicles"/> 
    <xs:complexType name="car"> 
     <xs:complexContent> 
      <xs:extension base="ex:vehicles"> 
       <xs:sequence/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:element name="motorbike" type="ex:motorbike" substitutionGroup="ex:vehicles"/> 
    <xs:complexType name="motorbike"> 
     <xs:complexContent> 
      <xs:extension base="ex:vehicles"> 
       <xs:sequence/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

Этот документ является действительным в отношении указанной выше схеме:

<main xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.exampleURI.com/example test.xsd" 
xmlns="http://www.exampleURI.com/example"> 
    <car></car> 
    <motorbike></motorbike> 
</main>