Co robi elementFormDefault
i kiedy powinno być używane?
Więc znalazłem kilka definicji elementFormDefault
wartości:
wykwalifikowanych - elementy i atrybuty są w targetNamespace schematu
niekwalifikowany - elementy i atrybuty nie mają przestrzeni nazw
Z tej definicji myślę więc, że jeśli schemat jest ustawiony jako kwalifikowany, to dlaczego należy poprzedzić typ przestrzenią nazw? A jakie są scenariusze, w których mógłbyś mieć jeden ustawiony jako niewykwalifikowany w tej sprawie? Próbowałem googlować, ale dostałem tylko kilka stron W3C, które były niezwykle trudne do zrozumienia.
To jest plik, z którym teraz pracuję, dlaczego muszę deklarować typ, jak target:TypeAssignments
wtedy, gdy deklaruję, że targetNamespace
jest taki sam jak xmlns:target
?
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:target="http://www.levijackson.net/web340/ns"
targetNamespace="http://www.levijackson.net/web340/ns"
elementFormDefault="qualified">
<element name="assignments">
<complexType>
<sequence>
<element name="assignments" type="target:TypeAssignments"
minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<complexType name="TypeAssignments">
<sequence>
<element name="assignment" type="target:assignmentInfo"
minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="assignmentInfo">
<sequence>
<element name="name" type="string"/>
<element name="page" type="target:TypePage"/>
<element name="file" type="target:TypeFile"
minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="id" type="string" use="required"/>
</complexType>
<simpleType name="TypePage">
<restriction base="integer">
<minInclusive value="50" />
<maxInclusive value="498" />
</restriction>
</simpleType>
<simpleType name="TypeFile">
<restriction base="string">
<enumeration value=".xml" />
<enumeration value=".dtd" />
<enumeration value=".xsd" />
</restriction>
</simpleType>
</schema>
Rozważmy następujący ComplexType
AuthorType
używany przezauthor
element<xsd:complexType name="AuthorType"> <!-- compositor goes here --> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="phone" type="tns:Phone"/> </xsd:sequence> <xsd:attribute name="id" type="tns:AuthorId"/> </xsd:complexType> <xsd:element name="author" type="tns:AuthorType"/>
Jeśli
elementFormDefault="unqualified"
to następujące wystąpienie XML jest prawidłowe
<x:author xmlns:x="http://example.org/publishing"> <name>Aaron Skonnard</name> <phone>(801)390-4552</phone> </x:author>
atrybut nazwiska autora jest dozwolony bez określania przestrzeni nazw (niekwalifikowany). Wszelkie elementy, które są częścią,
<xsd:complexType>
są traktowane jako lokalne dla complexType.Jeśli
elementFormDefault="qualified"
wtedy instancja powinna mieć kwalifikowane elementy lokalne
<x:author xmlns:x="http://example.org/publishing"> <x:name>Aaron Skonnard</name> <x:phone>(801)390-4552</phone> </x:author>
proszę zapoznać się z tym linkiem, aby uzyskać więcej informacji
źródło
Nowa, szczegółowa odpowiedź i wyjaśnienie starego, często zadawanego pytania ...
Krótka odpowiedź : jeśli nie dodasz
elementFormDefault="qualified"
doxsd:schema
,unqualified
wartość domyślna oznacza, że lokalnie zadeklarowane elementy nie znajdują się w przestrzeni nazw .Istnieje wiele nieporozumień dotyczących tego
elementFormDefault
, co powoduje, ale można to szybko wyjaśnić za pomocą krótkiego przykładu ...Uproszczona wersja Twojego XSD:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:target="http://www.levijackson.net/web340/ns" targetNamespace="http://www.levijackson.net/web340/ns"> <element name="assignments"> <complexType> <sequence> <element name="assignment" type="target:assignmentInfo" minOccurs="1" maxOccurs="unbounded"/> </sequence> </complexType> </element> <complexType name="assignmentInfo"> <sequence> <element name="name" type="string"/> </sequence> <attribute name="id" type="string" use="required"/> </complexType> </schema>
Kluczowe punkty:
assignment
Element jest lokalnie zdefiniowane.elementFormDefault
tounqualified
.elementFormDefault="qualified"
tak, aby znajdowałoassignment
się w docelowej przestrzeni nazw, jak można się spodziewać.form
atrybut wxs:element
deklaracjach, dla któregoelementFormDefault
ustalane są wartości domyślne.Pozornie poprawny XML
Wygląda na to, że ten XML powinien być prawidłowy zgodnie z powyższym XSD:
<assignments xmlns="http://www.levijackson.net/web340/ns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd"> <assignment id="a1"> <name>John</name> </assignment> </assignments>
Ogłoszenie:
assignments
miejscachassignments
i wszystkie jej elementy podrzędne w domyślnej przestrzeni nazw (http://www.levijackson.net/web340/ns
).Kłopotliwy błąd walidacji
Pomimo tego, że wygląda na poprawny, powyższy kod XML powoduje następujący mylący błąd weryfikacji:
Uwagi:
assignment
element, ale faktycznie znalazłassignment
element. ( WTF ){
i}
wokół”assignment
oznacza, że walidacja nie oczekiwała tutajassignment
żadnej przestrzeni nazw . Niestety, kiedy mówi, że znalazłassignment
element, nie wspomina, że znalazł go w domyślnej przestrzeni nazw, która różni się od żadnej przestrzeni nazw.Rozwiązanie
elementFormDefault="qualified"
doxsd:schema
elementu XSD. Oznacza to, że prawidłowy kod XML musi umieszczać elementy w docelowej przestrzeni nazw, gdy jest zadeklarowany lokalnie w XSD; w przeciwnym razie poprawny kod XML musi umieszczać lokalnie zadeklarowane elementy w żadnej przestrzeni nazw.assignment
nie znajdują się w przestrzeni nazw. Można to osiągnąć na przykład poprzez dodaniexmlns=""
doassignment
elementu.Kredyty: Dziękuję Michaelowi Kay za pomocną opinię na temat tej odpowiedzi.
źródło
W przypadku elementu elementFormDefault należy zauważyć, że ma on zastosowanie do elementów zdefiniowanych lokalnie , zazwyczaj nazwanych elementów w bloku complexType, w przeciwieństwie do elementów globalnych zdefiniowanych na najwyższym poziomie schematu. Dzięki elementFormDefault = "qualified" można adresować elementy lokalne w schemacie z poziomu dokumentu xml, używając docelowej przestrzeni nazw schematu jako domyślnej przestrzeni nazw dokumentu.
W praktyce użyj elementu elementFormDefault = "qualified", aby móc deklarować elementy w zagnieżdżonych blokach, w przeciwnym razie będziesz musiał zadeklarować wszystkie elementy na najwyższym poziomie i odwołać się do nich w schemacie w elementach zagnieżdżonych przy użyciu atrybutu ref, co spowoduje znacznie mniej zwarty schemat.
Ten fragment w XML Schema Primer mówi o tym: http://www.w3.org/TR/xmlschema-0/#NS
źródło
ElementFormDefault = "Qualified" służy do kontrolowania użycia przestrzeni nazw w dokumentach instancji XML (plik .xml), a nie przestrzeni nazw w samym dokumencie schematu (plik .xsd).
Określając elementFormDefault = "qualified", wymuszamy deklarację przestrzeni nazw, która ma być używana w dokumentach walidowanych za pomocą tego schematu.
Powszechną praktyką jest określanie tej wartości, aby zadeklarować, że elementy powinny być kwalifikowane, a nie niekwalifikowane. Jednak ponieważ atrybutFormDefault = "niekwalifikowany" jest wartością domyślną, nie trzeba jej określać w dokumencie schematu, jeśli nie chce się kwalifikować przestrzeni nazw.
źródło
Zauważyłem, że XMLSpy (przynajmniej wersja 2011) wymaga zdefiniowania targetNameSpace, jeśli używany jest elementFormDefault = "qualified". W przeciwnym razie nie zostanie zweryfikowany. Nie będzie też generować plików XML z prefiksami przestrzeni nazw
źródło