向XML注释或添加外部数据

时间:2017-10-09 17:08:07

标签: xml xsd xml-namespaces

拥有这样的XML:

<interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xsi:noNamespaceSchemaLocation="../../schema.xsd">
  <struct name="Owner" type="Person" />
  <variable name="Timestamp" />
</interface>

我想为某些元素添加其他属性,这些元素只会使用某些XML文档,并且针对对此信息感兴趣的特定方。例如,有一些能够显示/呈现XML文件的组件我会添加:

拥有这样的XML:

<interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xsi:noNamespaceSchemaLocation="../../schema.xsd">
  <struct name="Owner" type="Person" display:layout="vertical" />
  <variable name="Timestamp" display:hidden="true" />
</interface>

我不想更改我的XSD,因为这些附加信息是某些特定于软件模块的信息,并不适用于所有文档。

如果可能,我希望有其他XSD文件,可以验证这些新信息。

我怎样才能做到这一点?

我正在阅读有关命名空间,XSD和扩展类型的内容,但我担心它只允许扩展类型,因此我无法指定多个注释(display:,storage:...)

更新

  • 我可以修改现有架构 - 这没问题。但关键是,它不应该知道关于display:storage:等的任何问题,因为:
    • 只有一些文档会使用其他属性(如显示)。
    • 将来修复主模式时可能会添加这些新属性。想象一下,开发人员创建了一个新的软件,它可以处理这些XML文件并请求其他信息。他们会以某种方式与创建文档并在其中包含此附加信息的人达成一致,而无需修改系统的其余部分和主XSD。
  • 手工创建XML文件。实际上,拥有XSD的主要原因是帮助编辑,有错误下划线,关键字完成等。
  • 一个完美的解决方案是:
    • 只需添加一些其他命名空间(xmlns:display=xxx),突然在编辑文档时有一堆新属性,
    • 能够添加多个(xmlns:display=xxx xmlns:storage=yyy以及需要的任何内容并在将来定义)

如果说明从一开始就不清楚,请跟我说。

1 个答案:

答案 0 :(得分:2)

如果无法查看现有架构,很难对您的问题给出明确的答案。但是可以描述一些简单的案例:

  1. 现有架构对您关注的元素有松散的属性通配符,因此display:layoutstruct display:hidden接受(例如)variable,你可以在不验证扩展属性的情况下生活。
  2. 在这种情况下,不需要做任何事情。使用扩展属性与现有架构保持一致。

    1. 现有架构在您关注的元素上具有属性通配符,因此display:layoutstruct上的display:hidden接受(例如)variable,并且您希望验证器检查扩展属性的语法正确性,或者相关的通配符是严格的。
    2. 在这种情况下,您需要为扩展属性使用的命名空间编写模式文档,并确保在验证时将它们与现有模式一起加载。对于第一个,您可能有一个这样的模式文档:

      <xsd:schema xmlns:xsd="..."
                  xmlns:display="http://example.com/nss/display"
                  targetNamespace="http://example.com/nss/display"
                  >
        <xsd:attribute name="layout" type="xsd:string"/>
        <xsd:attribute name="hidden" type="xsd:boolean"/>
      
      </
      

      要确保加载其他命名空间的架构文档,请检查验证程序的API或CLI。在最糟糕的情况下,您需要编写一个单一的驱动程序&#39;除了加载适当的模式文档集之外什么都不做的文档。

      <xsd:schema xmlns:xsd="..."  
                  ...
                  >
        <xsd:include schemaLocation="schema.xsd"/>
        <xsd:import namespace="http://example.com/nss/display"
          schemaLocation="display.xsd"/>
        ...
      </
      
      1. 现有架构没有内置扩展点,但对您关注的元素使用顶级(命名)类型,并且不禁止这些顶级类型的扩展。
      2. 对于这种情况,您需要编写一个包含现有模式的模式文档,并使用您要使用的属性扩展相应的类型。

        1. 现有架构没有内置扩展点;它为您关注的元素使用顶级(命名)类型,但禁止扩展那些顶级类型。
        2. 架构作者已采取措施阻止您在使用原始架构文档时执行您想要执行的操作。

          复制现有架构,更改有问题的类型以允许或要求您要添加的属性,并在希望对其进行验证时使用原始架构,并在您希望对其进行验证时使用修改后的架构。当原始架构发生更改时,您需要镜像复制架构中的更改,以便保留原始架构与本地版本之间的所需关系。

          1. 原始架构使用相关元素的本地类型定义。
          2. 此处,架构作者也试图阻止您希望执行的扩展类型;您的解决方案是再次复制架构文档并修改您的副本。

              

            我正在阅读有关命名空间,XSD和扩展类型的内容,但我担心它只允许扩展类型,因此我可以指定多个注释(display:,storage:...)

            您提到的唯一修改是扩展。你完全正确的类型扩展只允许扩展。要限制类型,必须使用类型限制。如果原始模式允许,则可以跨模式文档边界执行扩展和限制。