Apa elementFormDefault
, dan kapan harus digunakan?
Jadi saya menemukan beberapa definisi untuk elementFormDefault
nilai:
memenuhi syarat - elemen dan atribut ada di targetNamespace skema
unqualified - elemen dan atribut tidak memiliki namespace
Jadi dari definisi itu saya akan berpikir bahwa jika skema diatur ke kualifikasi lalu mengapa Anda harus mengawali tipe dengan namespace? Dan skenario apa yang bahkan Anda setel ke tidak memenuhi syarat dalam hal ini? Saya mencoba Googling, tetapi yang saya dapatkan hanyalah beberapa halaman W3C yang sangat sulit dimengerti.
Ini adalah file yang saya kerjakan sekarang, mengapa saya perlu mendeklarasikan tipe seperti target:TypeAssignments
ketika saya mendeklarasikan targetNamespace
sama dengan 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>
Pertimbangkan ComplexType berikut yang
AuthorType
digunakan olehauthor
elemen<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"/>
Jika
elementFormDefault="unqualified"
maka Instance XML berikut ini valid
<x:author xmlns:x="http://example.org/publishing"> <name>Aaron Skonnard</name> <phone>(801)390-4552</phone> </x:author>
atribut nama pengarang diperbolehkan tanpa menentukan namespace (tidak memenuhi syarat). Setiap elemen yang merupakan bagian dari
<xsd:complexType>
dianggap sebagai lokal untuk complexType.jika
elementFormDefault="qualified"
maka instance tersebut harus memiliki elemen lokal yang memenuhi syarat
<x:author xmlns:x="http://example.org/publishing"> <x:name>Aaron Skonnard</name> <x:phone>(801)390-4552</phone> </x:author>
silakan lihat tautan ini untuk lebih jelasnya
sumber
Jawaban dan penjelasan baru dan mendetail untuk pertanyaan lama yang sering ditanyakan ...
Jawaban singkat : Jika Anda tidak menambahkan
elementFormDefault="qualified"
kexsd:schema
, maka nilai defaultnyaunqualified
berarti bahwa elemen yang dideklarasikan secara lokal tidak ada dalam namespace .Ada banyak kebingungan tentang apa
elementFormDefault
itu, tetapi ini dapat dengan cepat diklarifikasi dengan contoh singkat ...Versi sederhana XSD Anda:
<?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>
Poin utama:
assignment
elemen lokal didefinisikan.elementFormDefault
adalahunqualified
.elementFormDefault="qualified"
sehinggaassignment
ada di namespace target seperti yang diharapkan.form
atribut yang jarang digunakan padaxs:element
deklarasi yangelementFormDefault
menetapkan nilai default.XML Tampak Valid
XML ini sepertinya harus valid sesuai dengan XSD di atas:
<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>
Memperhatikan:
assignments
tempatassignments
dan semua turunannya di namespace default (http://www.levijackson.net/web340/ns
).Kesalahan Validasi yang Membingungkan
Meskipun terlihat valid, XML di atas menghasilkan kesalahan validasi yang membingungkan berikut:
Catatan:
assignment
elemen tetapi sebenarnya menemukanassignment
elemen. ( WTF ){
and}
aroundassignment
berarti validasi tidak diharapkanassignment
di namespace di sini. Sayangnya, ketika dikatakan bahwa ia menemukan sebuahassignment
elemen, ia tidak menyebutkan bahwa ia menemukannya di namespace default yang berbeda dari tidak ada namespace.Larutan
elementFormDefault="qualified"
kexsd:schema
elemen XSD. Ini berarti XML yang valid harus menempatkan elemen di namespace target ketika dideklarasikan secara lokal di XSD; jika tidak, XML yang valid harus menempatkan elemen yang dideklarasikan secara lokal tanpa namespace.assignment
tidak ada di namespace. Hal ini dapat dicapai, misalnya, dengan menambahkanxmlns=""
keassignment
elemen.Penghargaan: Terima kasih kepada Michael Kay atas umpan balik yang membantu tentang jawaban ini.
sumber
Penting untuk diperhatikan dengan elementFormDefault adalah bahwa ini berlaku untuk elemen yang ditentukan secara lokal , biasanya bernama elemen di dalam blok complexType, sebagai lawan dari elemen global yang ditentukan di tingkat atas skema. Dengan elementFormDefault = "kualifikasi" Anda dapat menangani elemen lokal dalam skema dari dalam dokumen xml menggunakan ruang nama target skema sebagai ruang nama default dokumen.
Dalam praktiknya, gunakan elementFormDefault = "kualifikasi" untuk dapat mendeklarasikan elemen dalam blok bersarang, jika tidak, Anda harus mendeklarasikan semua elemen di tingkat atas dan merujuknya ke skema dalam elemen bertingkat menggunakan atribut ref, menghasilkan skema yang jauh lebih kompak.
Bit dalam XML Schema Primer ini membahasnya: http://www.w3.org/TR/xmlschema-0/#NS
sumber
elementFormDefault = "memenuhi syarat" digunakan untuk mengontrol penggunaan ruang nama dalam dokumen contoh XML (file .xml), bukan ruang nama dalam dokumen skema itu sendiri (file .xsd).
Dengan menentukan elementFormDefault = "kualifikasi" kami memberlakukan deklarasi ruang nama untuk digunakan dalam dokumen yang divalidasi dengan skema ini.
Merupakan praktik umum untuk menentukan nilai ini untuk menyatakan bahwa elemen harus memenuhi syarat daripada tidak memenuhi syarat. Namun, karena atributFormDefault = "unqualified" adalah nilai default, ini tidak perlu ditentukan dalam dokumen skema, jika tidak ingin memenuhi syarat ruang nama.
sumber
Saya telah memperhatikan bahwa XMLSpy (setidaknya versi 2011) membutuhkan targetNameSpace yang ditentukan jika elementFormDefault = "memenuhi syarat" digunakan. Jika tidak, tidak akan memvalidasi. Dan juga tidak akan menghasilkan xml dengan awalan namespace
sumber