2012-12-19 15 views
10

Tworzę nową usługę wymiany danych w mojej firmie. Chcielibyśmy rozszerzyć istniejący obiekt zdefiniowany w pliku definicji core.xsd. Oto przykład tego, co należy zrobić:Jak zastąpić element Xsd wewnątrz elementu nadrzędnego/rozszerzonego

<xs:complexType name="parentType"> 
    <xs:sequence> 
    <xs:element name="departmentName" type="core:DEPARTMENT_NAME" 
       minOccurs="0" maxOccurs="1" />  
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="childType"> 
    <xs:complexContent> 
    <xs:extension base="parentType"> 
     <xs:sequence> 
     <xs:element name="departmentName" 
        type="core:DEPARTMENT_NAME" 
        minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

myślę, że to ma sens. Chcę zastąpić element nadrzędny i uczynić go wymaganym. Jednak prawidłowy plik xml byłby to. Gdzie jest teraz dodatkowa nazwa działu !?

<childType> 
    <departmentName>HR</departmentName> 
    <departmentName>IT</departmentName> 
</childType> 

Jak mogę to zrobić tak, że plik XML stałby się:

<childType> 
    <departmentName>IT</departmentName> 
</childType> 

Dzięki Craig

Odpowiedz

7

Trzeba użyć ograniczenie zamiast przedłużenia. Byłby to pełny, poprawny schemat dla wskazanego przez ciebie scenariusza (używałam obszernie przestrzeni nazw, aby był ważny).

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:core="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="parentType"> 
     <xs:sequence> 
      <xs:element name="departmentName" type="core:DEPARTMENT_NAME" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="childType"> 
     <xs:complexContent> 
      <xs:restriction base="parentType"> 
       <xs:sequence> 
        <xs:element name="departmentName" type="core:DEPARTMENT_NAME"/> 
       </xs:sequence> 
      </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:simpleType name="DEPARTMENT_NAME"> 
     <xs:restriction base="xs:string"/> 
    </xs:simpleType> 

    <xs:element name="childType" type="childType"/> 
</xs:schema> 
+0

Dzięki Petru, tego właśnie szukałem. Pytanie jednak: co się stanie, jeśli nadal będę chciał rozszerzyć parentType? Załóżmy, że chcę dodać brakujące pola do typu, który je rozszerza. Zauważyłem, że można ograniczyć lub rozszerzyć, ale nie oba dla typu parentType. Będę eksperymentować, ale czy muszę utworzyć typ grandChild, który rozszerza childType, który ma ograniczenia dla parentType? To wydaje się zbyt szczegółowe i kłopotliwe, czy nie ma czystszego rozwiązania? – Craig

+1

Aby zbudować na podstawie childType, musisz utworzyć grandchildType. Zgadzam się, że wydaje się to uciążliwe - utrzymanie xsd: ograniczenia szczególnie .. ale to XSD 1.0. Co do "czystszego" kwalifikatora ... To naprawdę szczegóły i oko patrzącego. Jeśli jest to nowy projekt, jestem pewien, że istnieją różne sposoby ułożenia hierarchii w taki sposób, że daje ona coś rozsądnego ... Musisz także myśleć w kategoriach XSD do kodowania powiązań ... –

Powiązane problemy