Frage

In XML ist es möglich, Elemente wieder zu verwenden?

Insbesondere ist das Problem, dass ich zu lösen versuche, ist die folgende. Ich möchte ein Element table definieren, die ein Element tableSchema und ein Element dataSource enthält. Ich möchte dies in einer Art und Weise tun, die ein tables zu einem tableSchema an anderer Stelle definiert beziehen. So betrachtete, kann ich mehrere Berichte definieren tables haben nach dem gleichen tableSchema.

Um zu klären, wäre ich in der Lage möchte Folgendes zu tun:

<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>

und

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

und haben tableSchemas bar und foo an anderer Stelle definiert, die möglicherweise in dem gleichen XML-Dokument.

Edited hinzufügen: Hier wird durch Table, meine ich nicht ein anderes XML-Schema. Ich meine, eine Definition, die Felder in einem table. Zum Beispiel würde Ich mag Lage sein, folgendes zu tun:

<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>

Dann wird in dem oben definiert Report1 einen Bericht, der zwei tables enthält, ein Format entspricht dem tableSchema foo, und ein zweites Format entspricht dem tableSchema bar und Report2 definiert einen Bericht, der eine table enthält, das formatiert ist gemäß die tableSchema foo und das Schema ist das gleiche wie in Report1.

War es hilfreich?

Lösung

Sie nicht bieten Kontext, was würde die Schaffung / diese XML-Parsing aber vorausgesetzt, Sie Kontrolle über diese haben, dann könnten Sie Ihre eigene Konvention für diese zB definieren:

<tableSchema ref="foo">

Wenn der Parser würde dann suchen Sie nach einem Element mit der ID von „foo“ die Tableinfo abgerufen werden.

Andere Tipps

Warum ist nicht nur die Definition? Sie definieren es in einem XML-Schema, dann ist es überall dort, wo Sie es in einem anderen XML-Schema, wie diese verwendet werden sollen:

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

Es gibt einen zweiten Aspekt auf Ihre Frage:. Für das XML-Dokument können angeben, welche Art von Table ist

Hier ist eine Analogie mit der OO-Programmierung: (1) einen übergeordneten Klasse, (2) definieren foo und bar als Subklassen davon. Danach (3) definieren den Typ eines Feldes ihrer gemeinsamen übergeordneten Klasse zu sein; und nun (4). ein Laufzeitobjekt kann entweder Unterklasse. Ist das sinnvoll? Ich denke, es ist das, was Sie in Bezug auf die ohnehin denken.

die Analogie Abwicklung: in XML, eine Klasse ist ein complex ; eine Unterklasse ist eine Erweiterung davon; ein Feld ist ein -Element und seine Klasse ist die type Attribut - und die Klasse eines Laufzeitobjekts ist die xsi: type ein Element in XML-Dokument . Entscheidend ist, dass im letzten Teil, xsi:. Typ

(1). Definieren Sie die gemeinsame Superklasse - eine XML complex:

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

(2). Definieren Sie die Subklassen - Erweiterungen des oben complex:

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

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

(3). Definieren Sie ein Feld der übergeordneten Klasse sein - ein Element zu sein, der complex erstreckte sich von:

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

(4). Nun kann die XML angeben, dass ein Element eines bestimmten complex in der XML selbst :

<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>

Beachten Sie, dass type ist etwas Besonderes, und ist im Namensraum angegeben definiert. In der Tat gibt es mehrere Namespace-Probleme, die frustrierend sein kann, aber der Schlüssel ist, dass es ist möglich zu tun, was Sie wollen.

Für ein vollständigeres Beispiel finden Sie in der XML-Schema-Primer .

Sie müssen möglicherweise eine XSL-Stylesheet-Transformation verwenden, um zu tun, was Sie wollen. Am Ende führt sie in einem vollständig und aufgelöst XML.

(ich kann die Frage noch nicht verstehen, aber ...) Angenommen, Sie die Textwerte in der Table buchstäblich verwenden mögen, dann wirklich es ist bis zu Ihrem Verarbeitungscode. Die XML ist nur die Darstellung der Daten. So könnten Sie Ihr eigenes Format bilden, wie diese sagen:

<tableSchema ref="foo"/>

Dann wird Ihr Werkzeug liest das gesamte Dokument, und erinnert sich an die Definitionen von foo und bar (in einer Tabelle). Dann beginnt es, die Berichte zu verarbeiten: wenn es Report1 verwenden geht, und die oben ref foo sehen, sieht es foo in der Hash-Tabelle und verwendet diese. Ist das die Art von Sache, die Sie das?

Wenn ja, gibt es ein wenig mehr Unterstützung für diese mit ID und IDREF-Tags verwenden, so müssen Sie dies:

<tableSchema myidref="foo"/>

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

Dann (glaube ich) das Parsing Tool bevölkert und für Sie die Suche in einer Tabelle. Sie müssen myidref und myid als vom Typ IDREF und ID in dem Schema / DTD definiert werden, so dass der Parser kennt sie speziell zu behandeln. So etwas wie (nur zeigen myidref):

<element name="tableSchema">
  <complexType>
    <xsd:attribute name="myidref" type="xsd:IDREF" use="required"/>
  </complexType>
</element>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top