ماذا تفعل ElectormDefault في XSD؟
-
13-09-2019 - |
سؤال
ماذا فعلت elementFormDefault
القيام به، ومتى يجب استخدامه؟
لذلك وجدت بعض التعاريف ل elementFormDefault
القيم:
تأهلت - العناصر والسمات موجودة في مساحة المستهدفة من المخطط
غير مؤهل - العناصر والسمات لا تملك مساحة اسم
لذلك من هذا التعريف، أعتقد أنه إذا تم تعيين مخطط مؤهل، فلماذا يجب عليك بادئة النوع باستخدام مساحة الاسم؟ وما هي السيناريوهات التي ستكون لديك حتى مجموعة واحدة غير مؤهل لهذا الأمر؟ لقد حاولت googling، ولكن كل ما حصلت عليه وكانت صفحات زوجين W3C كانت من الصعب للغاية فهمها.
هذا هو الملف الذي أعمله الآن، لماذا أحتاج إلى إعلان النوع target:TypeAssignments
عندما أعلن targetNamespace
كما هو نفسه 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>
المحلول
لا علاقة له ElectormDefault بأي شيء بمساحة الاسم من الأنواع في المخطط، فهو يدور حول مساحات أسماء العناصر في مستندات XML التي تتوافق مع المخطط.
إليك قسم الصلة من المواصفات:
Element Declaration Schema Component Property {target namespace} Representation If form is present and its ·actual value· is qualified, or if form is absent and the ·actual value· of elementFormDefault on the <schema> ancestor is qualified, then the ·actual value· of the targetNamespace [attribute] of the parent <schema> element information item, or ·absent· if there is none, otherwise ·absent·.
ما يعني ذلك هو أن المستهدف الذي أعلته في الجزء العلوي من المخطط فقط ينطبق فقط على العناصر في مستند XML المتوافق مع المخطط إذا كان إما ElectormDefault هو "مؤهل" أو يتم الإعلان عن العنصر بشكل صريح في المخطط بأنه يحتوي على نموذج = "مؤهل" وبعد
على سبيل المثال: إذا كان ElectormDefault غير مؤهل -
<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>
سيتوقع أن تكون العناصر "الاسم" لتكون في عناصر المستهدف و "الصفحة" في مساحة الاسم NULL.
لحفظ الاضطرار إلى وضع نموذج = "مؤهل" على كل إعلان عناصر، توضح ElementFormDefault = "المؤهل" يعني أن المستهدف ينطبق على كل عنصر ما لم يتم تجاوزه عن طريق وضع النموذج = "غير مؤهل" على إعلان العنصر.
نصائح أخرى
النظر في Complextype التالي AuthorType
استعمل من قبل author
جزء
<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"/>
إذا elementFormDefault="unqualified"
ثم بعد مثيل XML صالح
<x:author xmlns:x="http://example.org/publishing">
<name>Aaron Skonnard</name>
<phone>(801)390-4552</phone>
</x:author>
يسمح بسمة اسم المؤلف دون تحديد مساحة الاسم (غير مؤهل). أي عناصر والتي هي جزء من <xsd:complexType>
تعتبر المحلية لتحميل النمط.
إذا elementFormDefault="qualified"
ثم يجب أن يكون للمثيل العناصر المحلية المؤهلة
<x:author xmlns:x="http://example.org/publishing">
<x:name>Aaron Skonnard</name>
<x:phone>(801)390-4552</phone>
</x:author>
يرجى الرجوع هذه رابط لمزيد من التفاصيل
الجواب الجديد والتفصيلي والتفسير لسؤال قديم وذات طرحا ...
اجابة قصيرة: إذا كنت لا تضيف elementFormDefault="qualified"
ل xsd:schema
, ، ثم الافتراضي unqualified
القيمة تعني أن العناصر المعلنة محليا في لا اسم الاسم.
هناك الكثير من الارتباك فيما يتعلق بما elementFormDefault
هل، ولكن يمكن توضيح ذلك بسرعة مع مثال قصير ...
نسخة مبسطة من 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>
النقاط الرئيسية:
- ال
assignment
يتم تعريف العنصر محليا. - العناصر المحددة محليا في XSD ليست في مساحة الاسم بشكل افتراضي.
- هذا لأن القيمة الافتراضية ل
elementFormDefault
يكونunqualified
. - هذا يمكن أن يكون خطأ في التصميم من قبل منشئو XSD.
- الممارسة القياسية هي دائما استخدام
elementFormDefault="qualified"
لهذا السببassignment
في مساحة الاسم المستهدفة كما يتوقع المرء.
- هذا لأن القيمة الافتراضية ل
على ما يبدو صالح XML
يبدو أن هذا XML يبدو صحيحا وفقا لما سبق 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>
يلاحظ:
- مساحة الاسم الافتراضية على
assignments
أماكنassignments
وجميع النزولين في مساحة الاسم الافتراضية (http://www.levijackson.net/web340/ns
).
خطأ في التحقق من الصحة
على الرغم من البحث الصالح، فإن XML أعلاه غلة خطأ التحقق من الصحة مربكة التالية:
خطأ] TRY.XML: 4: 23: CVC-Complex-Type.2.4.A: تم العثور على محتوى غير صالح بدءا من العناصر "المهمة". من المتوقع واحدا من '{المهمة}'.
ملاحظات:
- لن تكون أول مطور لعن هذا التشخيص الذي يبدو أنه يقول ذلك المحتوى غير صالح لأنه من المتوقع أن تجد
assignment
عنصر ولكن وجدت بالفعلassignment
جزء. (ماهذا الهراء) - ماذا يعني هذا حقا:
{
و}
حولassignment
يعني أن التحقق من الصحة كان يتوقعassignment
في مساحة الاسم هنا. لسوء الحظ، عندما تقول أنه وجدassignment
العنصر، لا يذكر أنه وجدته في مساحة اسم افتراضية يختلف عن مساحة الاسم.
المحلول
- الغالبية العظمى من الوقت: يضيف
elementFormDefault="qualified"
إلىxsd:schema
عنصر XSD. هذا يعني أن XML صالح يجب وضع العناصر في مساحة الاسم المستهدفة عند الإعلان محليا في XSD؛ خلاف ذلك، يجب أن تضع XML صالح العناصر المعلنة محليا في مساحة الاسم. - أقلية صغيرة من الوقت: تغيير XML للامتثال لمتطلبات XSD ذلك
assignment
لا يكون في مساحة الاسم. يمكن تحقيق ذلك، على سبيل المثال، عن طريق إضافةxmlns=""
إلىassignment
جزء.
من المهم أن نتحدث مع ElectormDefault هو أنه ينطبق عليه محليا العناصر المحددة، والتي تسمى عادة عناصر داخل كتلة Complextype، بدلا من العناصر العالمية المحددة على المستوى الأعلى للمخطط. باستخدام ElectormDefault = "مؤهل"، يمكنك معالجة العناصر المحلية في المخطط من داخل مستند XML باستخدام مساحة الاسم المستهدفة في المخطط كاسم المسام الافتراضي للمستند.
في الممارسة العملية، استخدم ElementFormDefault = "مؤهل" لتكون قادرا على إعلان عناصر في كتل متداخلة، وإلا فسيتعين عليك إعلان جميع العناصر على المستوى الأعلى وأحرف عليها في المخطط في العناصر المتداخلة باستخدام سمة المرفأ، مما يؤدي إلى مخطط أقل مدمجة بكثير.
هذا الشيء في XML Schema Primer يتحدث عن ذلك: http://www.w3.org/tr/xmlschema-0/#NS.
يستخدم ElementFormDefault = "المؤهل" للتحكم في استخدام مساحات الأسماء في مستندات مثيل XML (ملف .xml)، بدلا من مساحات الأسماء في وثيقة المخطط نفسها (ملف .xsd).
من خلال تحديد ElementFormDefault = "مؤهل" نحن نفرض إعلان مساحة الاسم لاستخدامه في المستندات التي تم التحقق منها مع هذا المخطط.
من الممارسات الشائعة تحديد هذه القيمة للإعلان عن أن العناصر يجب أن تكون مؤهلة بدلا من غير مؤهل. ومع ذلك، نظرا لأن AttributeFormDefault = "غير مؤهل" هو القيمة الافتراضية، فلا يحتاج إلى تحديدها في مستند المخطط، إذا كان المرء لا يريد تأهل مساحات الأسماء.
لقد لاحظت أن XMLSPY (إصدار على الأقل لعام 2011) يحتاج إلى مساحة تتراكم محددة إذا تم استخدام ElectormDefault = "المؤهل". خلاف ذلك لن تتحقق. وكذلك لن تولد XMLs بادئة مساحة الاسم