مخطط XML ومشكلة عند اشتقاق من نوع مختلط
-
28-09-2019 - |
سؤال
لديّ مخطط XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="content" type="contentType"/>
<xs:complexType name="contentType">
<xs:complexContent>
<xs:extension base="versionedElementType">
<xs:sequence>
<xs:element name="item" type="itemType" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="itemType" mixed="true">
<xs:complexContent>
<xs:extension base="itemTypeBase">
<xs:sequence>
<xs:element name="order" type="xs:unsignedInt"/>
<xs:element name="id" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- Simple type convert to complex type -->
<xs:complexType name="itemTypeBase" mixed="true">
<xs:simpleContent>
<xs:extension base="itemDescriptionType">
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Simple type -string restriction -->
<xs:simpleType name="itemDescriptionType" >
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="64"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="versionedElementType">
<xs:attribute name="version" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
الذي أستخدمه للتحقق من صحة مثيل XML هذا (أريد خلط النص في عنصر "العنصر" مع ترتيب العناصر الفرعية "و" ID "):
<?xml version="1.0" encoding="UTF-8"?>
<content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Content.xsd"
version ="1.0">
<item>Description here...
<order>2</order>
<id>2</id>
</item>
</content>
كل ما فعلت ، لا يزال التحقق من الصحة يقول taht هناك خطأ:
يجب خلط نوع المحتوى للنوع المشتق وإنشاء قاعدته أو أن يكون كلاهما عنصرًا فقط. اكتب "itemType" مختلطة ، لكن نوع القاعدة ليس كذلك.
ولكن أستطيع أن أرى أن كلا النوعين - itemType و itemTypeBase مختلطون !!
شكرا جزيلا ستين
المحلول
بادئ ذي بدء ، فإن الخطأ الذي أرى ما إذا كنت أفتح مخططك في Visual Studio 2010 هو:
يجب أن يكون للنوع المشتق والنوع القائم نفس نوع المحتوى.
في مخططك الحالي النوع itemTypeBase
يتم تعريفه باحترام <xs:simpleContent>
والنوع المشتق itemType
مع احترام <xs:complexContent>
وهو غير مسموح به. إما أنك لا تسمح بأي عناصر فرعية واستخدام <xs:simpleContent>
أو تستخدم عناصر الأطفال والاستخدام <xs:complexContent>
.
أنا شخصياً لا أحب ولا أستخدم الأنواع المختلطة. إذا فهمت أنك تصحح ، فأنت تريد إجراء بعض القيود في النص من المحتوى. تريد الحصول على طول المحتوى بين 1 و 64 حرفًا. ولكن <order>2</order>
, <id>2</id>
وجميع المساحة البيضاء ، الشاملة لأحرف الخط الجديدة ، هي أيضًا جزء من المحتوى. اذا اردت ذلك <item>
لديه محتوى بسيط ، ثم لا يمكنك إدخال عناصر الطفل في الداخل.
لذلك سيكون الحل البرازيت بعيدًا عن النموذج المختلط ويستخدم مستند XML في النموذج
<?xml version="1.0" encoding="utf-8"?>
<content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Content.xsd"
version ="1.0">
<item>
<description>Description here...</description>
<order>2</order>
<id>2</id>
</item>
</content>
حيث content.xsd هو
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="content" type="contentType"/>
<xs:complexType name="contentType">
<xs:sequence>
<xs:element name="item" type="itemType"
minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="version" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="itemType">
<xs:sequence>
<xs:element name="description" type="itemDescriptionType"/>
<xs:element name="order" type="xs:unsignedInt"/>
<xs:element name="id" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="itemDescriptionType" >
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="64"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
كل شيء سيكون بسيطًا وواضحًا للغاية.