مخطط XML: مشكلات مساحة الاسم عند استيراد العناصر المشتركة
-
26-09-2019 - |
سؤال
عند محاولة استيراد التعريفات المشتركة من مخطط XML ، يمكنني أن أشير بشكل صحيح إلى أنواع مشتركة ، لكن الإشارة إلى العناصر المشتركة تسبب أخطاء التحقق من الصحة.
هذا هو المخطط الذي يستورد التعاريف المشتركة (example.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:shared="http://shared.com">
<xs:import namespace="http://shared.com" schemaLocation="shared.xsd"/>
<xs:element name="example">
<xs:complexType>
<xs:sequence>
<xs:element ref="importedElement"/>
<xs:element ref="importedType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="importedElement">
<xs:complexType>
<xs:sequence>
<xs:element ref="shared:fooElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="importedType">
<xs:complexType>
<xs:sequence>
<xs:element name="bar" type="shared:barType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
هذه هي التعاريف المشتركة (shared.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://shared.com"
targetNamespace="http://shared.com">
<xs:element name="fooElement">
<xs:simpleType>
<xs:restriction base="xs:integer"/>
</xs:simpleType>
</xs:element>
<xs:simpleType name="barType">
<xs:restriction base="xs:integer"/>
</xs:simpleType>
</xs:schema>
الآن فكر في مثيل XML:
<?xml version="1.0"?>
<example
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="example.xsd">
<importedElement>
<fooElement>42</fooElement>
</importedElement>
<importedType>
<bar>42</bar>
</importedType>
</example>
عند التحقق من صحة ، يعمل "ImportedType" بشكل جيد تمامًا ، لكن "الاستيراد" يعطي الخطأ التالي:
تم العثور على محتوى غير صالح بدءًا من عنصر "fooelement". واحد من '{"http://shared.com": من المتوقع fooelement} '
أظن أن مشاكلي مرتبطة بقضايا مساحة الاسم (ومن هنا جاءت إلى حد ما "Gotedelement ولكنها كانت تتوقع fooelement") - أي تلميحات حول ما هو الخطأ هنا؟
المحلول
أنت تشير fooElement
كما لو كان في أي مساحة اسم ، تحتاج إلى استخدام مساحة الاسم الصحيحة في مستند المثيل الخاص بك:
<?xml version="1.0"?>
<example
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="example.xsd" xmlns:shared="http://shared.com">
<importedElement>
<shared:fooElement>42</shared:fooElement>
</importedElement>
<importedType>
<bar>42</bar>
</importedType>
</example>
تعديل: كان يجب أن أشرت: هذه هي الاختلافات بين الأنواع و عناصر; ؛ يظهر الأخير فقط في المستندات (مع بعض الاستثناءات) ، ولهذا السبب يعمل نوعك المستورد كما تريد ، وعنصرك لا.