2013-01-18 16 views
5

Mam schematu XML, który definiuje podstawowe pola dla samochodu:Zastępowanie i zmiana XML element typu bazowego

<xs:simpleType name="FuelType"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Regular Unleaded"/> 
     <xs:enumeration value="High Octane"/> 
     <xs:enumeration value="Leaded"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:complexType name="CarType"> 
    <xs:sequence> 
     <xs:element name="Make" type="xs:string"/> 
     <xs:element name="Model" type="xs:string"/> 
     <xs:element name="Cylinders" type="xs:int"/> 
     <xs:element name="Fuel" type="FuelType"/> 
    </xs:sequence> 
</xs:complexType> 

Teraz powiedzmy, że chcemy zdefiniować Honda typ samochodu, który rozciąga się od CarType ale ma własną definicję paliwa:

<xs:simpleType name="HondaFuelType"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="85"/> 
     <xs:enumeration value="87"/> 
     <xs:enumeration value="89"/> 
     <xs:enumeration value="91"/> 
     <xs:enumeration value="93"/> 
     <xs:enumeration value="95"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:complexType name="HondaCarType"> 
    <xs:complexContent> 
     <xs:extension base="car:CarType"> 
      <xs:sequence> 
       <xs:element name="Fuel" type="HondaFuelType"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

Rozszerzanie CarType dostaje mi wszystko, co chcę, ale schemat pozwala teraz na dwa elementy o nazwie Paliwo (w różnych przestrzeniach nazw). Oto przykład próbka xml:

<HondaCar xmlns="HondaNS" xmlns:car="CarNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="HondaNS D:\Development\Temp\honda.xsd"> 
    <car:Make/> 
    <car:Model/> 
    <car:Cylinders>4</car:Cylinders> 
    <car:Fuel>High Octane</car:Fuel> 
    <Fuel>87</Fuel> 
</HondaCar> 

Choć jest doskonale prawidłowy XML to nie ma logicznego sensu (przynajmniej dla mnie). Zamierzałem rozszerzyć typ bazy o przesłonięcie * Paliwa *, aby umożliwić tylko wartości określone w HondaFuelType.

Czy istnieje sposób mogę przesłanianie lub maskować bazę paliwa elementem w moim rozszerzonego typu?

Odpowiedz

6

Możesz robić rzeczy bardzo podobne do tego, co opisujesz, ale w XSD nie jest możliwe wykonanie dokładnie tego, co opisujesz. Deklaracja "podstawowa" złożonego typu CarType stanowi pewną liczbę zobowiązań wobec konsumenta danych, które muszą być przestrzegane przez wszystkie typy pochodne od tego, czy to przez ograniczenie czy rozszerzenie. Należą do nich:

  • Wystąpienia CarType będą mieć dzieci o nazwie Marka, Modelu, Cylindrów i Paliwa, ze wskazanymi typami.
  • Wartości elementów Marka i Modelu będą ciągami.
  • Wartość elementu Cylinders będzie równa xs: int.
  • Wartość elementu Paliwo zostanie narysowana z zestawu ciągów {"Regularne bezołowiowe", "Ołówkowane", "Wysoka oktanowa"}.

To ostatnie z tych zobowiązań, z którymi masz kłopoty.

Po rozszerzeniu typu dodaje się nowe elementy podrzędne na końcu modelu zawartości; dla XSD 1.0 zawsze będzie prawdą, że dla każdego elementu, który jest ważny wobec rozszerzenia, możliwe jest zrzucenie zera zer lub większej liczby potomków i utworzenie elementu, który byłby ważny w stosunku do typu podstawowego. Dlatego twoje rozszerzenie kończy się na dwóch elementach paliwowych.

Jeśli potrzebujesz tylko jednego elementu paliwowego, to co chcesz zrobić, to ograniczyć, nie rozszerzać, CarType. Ograniczenie, które masz na myśli, nie jest prawnym ograniczeniem elementu paliwowego typu podstawowego. Ograniczenie też nie zadziała tutaj.

Jedną z możliwości, oczywiście, jest uogólnienie CarType, tak aby jego element Paliwa zaakceptował xs: string, a następnie ograniczyć go dwukrotnie, jeden raz, aby wyprodukować coś w rodzaju istniejącego CarType, i jeden raz, aby uzyskać odmianę Hondy, którą posiadasz umysł.

Mam nadzieję, że to pomoże.

-1

miałem podobny problem i jest to jak mam stałe:

Defined abstrakcyjną klasę bazową: CarType w Javie.

Tworzenie zwykłych getter/ustawiające dla wszystkich własności z wyjątkiem nieruchomości/s, które chcesz zrobić rodzajową dla rozciągliwości:

public <T extends CarType> T getCarType() { 
    return (T) ref; 
} 

Tworzenie elementu xsd z typem java przy użyciu xsd: adnotacji na xsj kompilator użyj właściwej oceny.

<xsd:complexType name="carType"> 
    <xsd:annotation> 
     <xsd:appinfo> 
      <jaxb:class ref="com.yourclass.model.CarType"/> 
     </xsd:appinfo> 
    </xsd:annotation> 
</xsd:complexType> 

teraz użyć tego jako podstawy rozszerzenia dla wszystkich innych elementów XSD jak robiłeś wcześniej. Dzięki temu możesz ustawić/uzyskać dowolny super typ dla CarType.

Mam nadzieję, że to pomoże.

Powiązane problemy