代码之家  ›  专栏  ›  技术社区  ›  jason

XML重用问题

  •  2
  • jason  · 技术社区  · 16 年前

    在XML中,是否可以重用元素?

    具体来说,我要解决的问题是:我想定义一个元素 table 包含元素的 tableSchema 一个元素 dataSource . 我想用一种 桌子 s可指a 表表 在别处定义。当然,我可以有多个报告定义 桌子 S根据相同 表表 .

    为了澄清,我希望能够做到以下几点:

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

    并拥有 表表 S bar foo 在其他地方定义,可能在同一个XML文档中。

    编辑后添加:这里,按TableSchema,我指的不是另一个XML模式。我的意思是定义 桌子 . 例如,我希望能够执行以下操作:

    <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 定义包含两个 桌子 S,一个根据 表表 ,第二个根据 表表 酒吧 Report2 定义包含一个 桌子 它是根据 表表 这个模式和 报告1 .

    4 回复  |  直到 11 年前
        1
  •  2
  •   Marplesoft    16 年前

    您没有提供有关将要创建/分析此XML的内容的上下文,但假设您可以控制此XML,则可以为此定义自己的约定,例如:

    <tableSchema ref="foo">
    

    然后解析器将在其中查找ID为“foo”的元素以检索TableSchema信息。

        2
  •  1
  •   13ren    16 年前

    为什么不包括定义?在一个XML模式中定义它,然后 include 无论您想在哪里在另一个XML模式中使用它,如下所示:

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

    问题的第二个方面是:XML文档能够指定 表表 它是。

    这里有一个与OO编程类似的例子:(1)定义一个超类,(2)将foo和bar定义为它的子类。然后,(3)将字段类型定义为它们的公共超类;现在(4)。运行时对象可以是任何一个子类。这有道理吗?不管怎样,我认为这就是你的想法。

    完成这个类比:在XML中,类是 复合型 ;子类是 延伸 一个领域就是 要素 它的阶级就是 类型 属性-运行时对象的类是 XSI:类型 一个 要素 在一个 XML文档 . 关键是最后一部分, XSI:类型 .

    (1)。定义公共超级类-XML complexType:

    <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 Schema Primer .

        3
  •  0
  •   Otávio Décio    16 年前

    您可能需要使用XSL样式表转换来执行您想要的操作。最后,它将生成一个完整且已解析的XML。

        4
  •  0
  •   13ren    16 年前

    (我可能还不理解这个问题,但是…)假设您想从字面上使用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>
    

    然后,(我认为)解析工具将为您填充并查找表。您需要在schema/dtd中将myidref和myid定义为idref和id类型,这样解析器就知道要对它们进行特殊处理。比如(只显示myidref):

    <element name="tableSchema">
      <complexType>
        <xsd:attribute name="myidref" type="xsd:IDREF" use="required"/>
      </complexType>
    </element>