سؤال

في XML، هل من الممكن إعادة استخدام العناصر؟

وعلى وجه التحديد، المشكلة التي أحاول أن حل هي ما يلي: أريد أن تعريف table العنصر الذي يحتوي على عنصر tableSchema وdataSource عنصر. أريد أن أفعل هذا في الطريقة التي tables يمكن أن يشير إلى tableSchema محددة في مكان آخر. Thusly، ويمكن أن يكون لها تقارير متعددة التي تحدد tables وفقا لنفس tableSchema.

لتوضيح، وأود أن تكون قادرة على القيام بما يلي:

<report name="Report1">
  <page>
    <table>
      <!--reference to tableSchema named "foo"-->
      <dataSource>fooData</dataSource>
    </table>
  </page>
  <page>
    <table> 
      <!--reference to tableSchema named "bar"-->
      <dataSource>barData</dataSource>
    </table>
  </page>
</report>

و

<report name="Report2">
  <page>
    <table>
      <!--reference to tableSchema named "foo" (same as above!)-->
      <dataSource>anotherFooData</dataSource>
    </table>
  </page>
</report>

ولقد tableSchemas bar وfoo تعرف مكان آخر، ربما في وثيقة XML نفسها.

وقام لإضافة: وهنا، من tableSchema، وأنا لا أقصد مخطط XML آخر. أعني تعريف الحقول في table. على سبيل المثال، وأود أن تكون قادرة على القيام بما يلي:

<tableSchema name="bar">
    <field>
      <displayName>bar1</displayName>
      <sourceName>bar1Source</sourceName>
      <format>Currency</format>
    </field>
    <field>
      <displayName>bar2</displayName>
      <sourceName>bar2Source</sourceName>
      <format>Text</format>
    </field>
</tableSchema>

<tableSchema name="foo">
    <field>
      <displayName>foo1</displayName>
      <sourceName>foo1Source</sourceName>
      <format>Percent</format>
    </field>
</tableSchema>

وبعد ذلك، في أعلاه، يحدد Report1 تقرير يحتوي على اثنين tables، واحدة منسقة وفقا لtableSchema foo، والثانية منسقة وفقا لtableSchema bar، ويحدد Report2 تقرير يحتوي table واحد الذي تم تنسيقه وفقا ل وtableSchema foo وأن المخطط هو نفسه كما هو الحال في Report1.

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

المحلول

وأنت لم تقدم السياق على ما من شأنه أن يكون خلق / تحليل هذه XML ولكن على افتراض لديك السيطرة على هذا ثم هل يمكن أن تحدد الاتفاقية الخاصة بك لهذا على سبيل المثال:

<tableSchema ref="foo">

وأين محلل سوف ثم ابحث عن عنصر مع معرف "فو" لاسترداد المعلومات tableSchema.

نصائح أخرى

لماذا لا تشمل فقط تعريف؟ يمكنك تحديد ذلك في مخطط XML واحد، ثم <م> تضمين أينما تريد استخدامه في مخطط XML آخر، مثل هذا:

<include schemaLocation="http://www.example.com/schemas/barDef.xsd"/>
<include schemaLocation="http://www.example.com/schemas/fooDef.xsd"/>

وهناك على الجانب الثاني على سؤالك: للمستند XML لتكون قادرة على تحديد أي نوع من tableSchema هو

وهنا وجود تشابه مع برمجة OO: (1) تحديد الفائقة، (2) تحديد فو وبار كما فرعية منه. ثم، (3) تحديد نوع حقل لتكون من الطبقة المتفوقة المشتركة؛ والآن (4). كائن وقت يمكن إما فئة فرعية. هل هذا منطقي؟ وأعتقد أن هذا ما كنت أفكر في شروط على أي حال.

لإكمال هذا التشبيه: في XML، فئة هي <م> complexType . فئة فرعية هي <م> تمديد منه. حقل هو العنصر والطبقة انها هي التي نوع السمة - وفئة من كائن وقت التشغيل هو XSI: نوع من <م > العنصر في وثيقة XML <م> . الشيء الحاسم هو أن الجزء الأخير، <م> XSI: نوع

و(1). تعريف فئة سوبر المشتركة - وهي complexType XML:

<complexType name="MySuperType">
  ...
</complexType>

(2). تحديد الفئات الفرعية - ملحقات من complexType أعلاه:

<complexType name="Foo">
  <complexContent>
    <extension base="MySuperType">
      ...
    </extension>
  </complexContent>
</complexType>

<complexType name="Bar">
  <complexContent>
    <extension base="MySuperType">
      ...
    </extension>
  </complexContent>
</complexType>

(3). تعريف حقل لتكون من الطبقة المتفوقة - عنصر ليكون من complexType امتدت من:

<element name="tableSchema" type="mySuperType"/>

و(4). الآن يمكن للXML يحدد أن عنصر هو من معين complexType <م> في XML نفسها :

<report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <page>
    <table>
      <tableSchema xsi:type="foo"/>
      <dataSource>fooData</dataSource>
    </table>
  </page>
  <page>
    <table> 
      <tableSchema xsi:type="bar"/>
      <dataSource>barData</dataSource>
    </table>
  </page>
</report>

لاحظ أن <م> نوع هو خاص، ويتم تعريفه في مساحة معينة. في الواقع، هناك العديد من القضايا مساحة الاسم الذي يمكن أن يكون محبطا، ولكن الشيء الرئيسي هو أنه هو ممكن أن تفعل ما تريد.

لمثال أكثر اكتمالا، الرجاء مراجعة XML مخطط التمهيدي .

وقد تضطر إلى استخدام تحويل أنماط XSL لتفعل ما تريد. في نهاية الأمر سوف يؤدي إلى XML كاملة وحلها.

و(I قد لا أفهم السؤال بعد، ولكن ...) على افتراض انك تريد استخدام القيم النص في tableSchema حرفيا، ثم انها حقا يصل الى رمز معالجة الخاص بك. وXML هو مجرد تمثيل البيانات. لذلك يمكن أن تشكل شكل الخاص بك، مثل هذا القول:

<tableSchema ref="foo"/>

وبعد ذلك أداة بك يقرأ المستند بأكمله، ويتذكر تعاريف فو وشريط (في جدول). ثم، ويبدأ لمعالجة التقارير: عندما يذهب لاستخدام Report1، وانظر المرجع أعلاه لفو، فإنه يبحث عن فو في جدول التجزئة ويستخدم ذلك. غير أن هذا النوع من الشيء الذي يعني؟

وإذا كان الأمر كذلك، هناك المزيد من الدعم القليل عن هذه باستخدام بطاقات هوية وIDREF، بحيث يكون لديك هذا:

<tableSchema myidref="foo"/>

<tableSchema myid="foo">
    <field>
      <displayName>foo1</displayName>
      <sourceName>foo1Source</sourceName>
      <format>Percent</format>
    </field>
</tableSchema>

وبعد ذلك، (على ما أظن) فإن أداة تحليل تعبئة والبحث عن الجدول بالنسبة لك. تحتاج إلى تعريف myidref وmyid اعتبارا من نوع IDREF وID في مخطط / DTD، وبالتالي فإن محلل يعرف التعامل معها بشكل خاص. شيء من هذا القبيل (مجرد عرض myidref):

<element name="tableSchema">
  <complexType>
    <xsd:attribute name="myidref" type="xsd:IDREF" use="required"/>
  </complexType>
</element>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top