كيفية الإعلان عن حالة مخطط XML خاص (XSD).

StackOverflow https://stackoverflow.com/questions/410628

  •  03-07-2019
  •  | 
  •  

سؤال

أحتاج إلى مساعدتك لتحديد حالة خاصة في مخطط XML:تسلسل يحتوي على عنصرين:"x" و "y" حيث:

  • <x> يمكن أن يظهر العنصر من 0 إلى مرات غير منضمة في التسلسل

  • <y> يمكن أن يظهر العنصر من 0 إلى 1 مرة في التسلسل

  • <x> و <y> يمكن أن تكون المواقع في أي مكان - أي أنه من الممكن أن تكون هناك أوقات غير محدودة لـ <x> عنصر ثم واحد <y> العنصر، ثم مرات غير منضمة <x> عنصر.

أمثلة XML لهذه المشكلة:

مثال 1

<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

مثال رقم 2

<y>stuff</y>
<x>stuff</x>
<x>stuff</x>

مثال رقم 3

<x>stuff</x> 
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

شكرًا!

هل كانت مفيدة؟

المحلول

لأسباب مختلفة، لم تعمل أي من عينات يوفال أو مو أو ديفيدشيلدون.هذا واحد يفعل.

    <xs:complexType name="myComplexType">
    <xs:sequence>
        <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        <xs:sequence minOccurs="0">
            <xs:element name="y" type="xs:string"/>
            <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:sequence>
    </xs:complexType>

نصائح أخرى

يحرر:كما ذكر الوشي، الحل الذي قدمته غير صحيح.وفقًا للمواصفات، يمكن للعنصر الموجود في xs:all أن يظهر صفرًا أو مرة واحدة فقط.أسف لأي ازعاج

أعتقد أن ما تريده ليس تسلسلاً.لا يحدد التسلسل العناصر فحسب، بل يحدد الترتيب أيضًا.وفي حالتك قد يتغير الترتيب.هل جربت XS:All؟

<xs:complexType name="myComplexType">
  <xs:all>
    <xs:element name="x" type="xs:string" maxOccurs="unbounded"/>
    <xs:element name="y" type="xs:string" maxOccurs="1"/>
  </xs:all>
</xs:complexType>

قد يكون هناك نهج آخر يتمثل في جعله تسلسلًا ولكن ضع علامة على التسلسل maxOccurs="unbounded"

لقد مر وقت طويل منذ أن استخدمت المخطط، ولكن أعتقد أن التسلسلات هي إجابتك هنا.

يجب أن يكون لديك عدد لا محدود من الاختيارات بين (x)، أو (y متبوعًا بـ x).

<xsd:element name="parent">
  <xsd:complexType>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="x" type="xs:string"/>
      <xsd:sequence>
        <xsd:element name="y" type="xsd:string" />
        <xsd:element name="x" type="xsd:string" />
      </xsd:sequence>
    </xsd:choice>
  </xsd:complexType>  
</xsd:element>  

ليست معقدة للغاية.من أعلى رأسي، ينبغي أن يكون شيء من هذا القبيل:

<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 

نظرًا لأن كل عنصر في XSD اختياري بشكل افتراضي، فإن XSD هذا سوف يطابق بنية XML التي حددتها، مع y ظهور العنصر في أي مكان قبل أو بعد أو بين x العناصر بحد أقصى 1

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top