Вопрос повторного использования XML - PullRequest
2 голосов
/ 06 мая 2009

В XML можно ли повторно использовать элементы?

В частности, проблема, которую я пытаюсь решить, заключается в следующем. Я хочу определить элемент table, который содержит элемент tableSchema и элемент dataSource. Я хочу сделать это так, чтобы table s мог ссылаться на tableSchema, определенный в другом месте. Таким образом, я могу иметь несколько отчетов, определяющих table s в соответствии с одним и тем же 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>

и tableSchema s 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 определяет отчет, который содержит два table s, один отформатирован в соответствии с tableSchema foo, а второй отформатирован в соответствии с tableSchema bar, и Report2 определяет отчет, который содержит один table, отформатированный в соответствии с tableSchema foo, и эта схема такая же, как в Report1.

Ответы [ 4 ]

2 голосов
/ 06 мая 2009

Вы не предоставили контекст относительно того, что будет создавать / анализировать этот XML, но предполагая, что у вас есть контроль над этим, вы можете определить свое собственное соглашение для этого, например:

<tableSchema ref="foo">

Где анализатор тогда будет искать элемент с идентификатором "foo" для получения информации tableSchema.

1 голос
/ 06 мая 2009

Почему бы просто не включить определение? Вы определяете его в одной XML-схеме, а затем включаете его везде, где вы хотите использовать его в другой XML-схеме, например:

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

Есть еще один аспект вашего вопроса: чтобы в XML-документе можно было указать, какой тип tableSchema это.

Вот аналогия с ОО-программированием: (1) определить суперкласс, (2) определить foo и bar как его подклассы. Затем (3) определите тип поля для их общего суперкласса; и сейчас (4). объект во время выполнения может иметь любой подкласс. Имеет ли это смысл? Я думаю, это то, о чем ты думаешь в любом случае.

Для завершения аналогии: в XML классом является complexType ; подкласс является расширением этого; поле является элементом , а его класс является его атрибутом type - а классом объекта времени выполнения является xsi: type элемента в XML-документе . Главное, что последняя часть, xsi: type .

* * Тысяча тридцать один (1). Определите общий суперкласс - XML ​​complexType:
<complexType name="MySuperType">
  ...
</complexType>
* 1 034 * (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>

Обратите внимание, что type является специальным и определяется в заданном пространстве имен. На самом деле, есть несколько проблем с пространством имен, которые могут расстраивать, но главное в том, что позволяет делать то, что вы хотите.

Более полный пример приведен в Учебник по XML-схеме .

0 голосов
/ 07 мая 2009

(Я, возможно, еще не понял вопроса, но ...) Если вы хотите использовать текстовые значения в tableSchema буквально, тогда это действительно ваш код обработки. XML - это просто представление данных. Таким образом, вы можете создать свой собственный формат, например, сказать:

<tableSchema ref="foo"/>

Затем ваш инструмент читает весь документ и запоминает определения foo и bar (в таблице). Затем он начинает обрабатывать отчеты: когда он использует Report1 и видит приведенную выше ссылку на foo, он ищет foo в хэш-таблице и использует ее. Это то, что вы имеете в виду?

Если это так, то есть немного больше поддержки для этого с использованием тегов ID и 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>
0 голосов
/ 06 мая 2009

Возможно, вам придется использовать преобразование таблицы стилей XSL, чтобы делать то, что вы хотите. В конце концов это приведет к полному и разрешенному XML.

...