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

“扩展”XML架构

  •  2
  • mathieu  · 技术社区  · 15 年前

    我正试图“扩展”一个XML模式(例如,这里的nhibernate),以便在其中添加我自己的实体。 我一直坚持到验证会在“exm:foo”(和exm:foobar)实体上阻塞,因为“base”模式不允许这样做。如何在不更改基本模式的情况下做到这一点?

    Sample:

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Test" namespace="Test.DataAccess.Entities" xmlns:exm="urn:extend-mappings">
      <class name="Post" table="POSTS" xmlns="urn:nhibernate-mapping-2.2" >
        <exm:foo bar="baz" />
    
        <property name="Body" type="String" column="BODY">
          <exm:foobar />
        </property>
    
        [...]
    
      </class>
    </hibernate-mapping>
    
    2 回复  |  直到 13 年前
        1
  •  2
  •   Martin v. Löwis    15 年前

    理想情况下,模式允许通过xs:any声明在选定位置进行扩展。不幸的是,NHibernate模式没有。

    因此,您必须编写自己的模式,并导入现有的模式。在这种方法中,您可以从现有的基本模式类型派生新的模式类型。不幸的是,元素 class nHibernate的定义使用匿名类型,您不能扩展该类型。因此,您必须定义自己的类元素并复制nhibernate的内容模型,在需要的地方扩展它。

    因此,处理基本模式的应用程序可能无法处理扩展模式,因此您还必须重写所有工具。

        2
  •  0
  •   Stefan Steinegger    13 年前

    你可以用 <meta> 用于将附加信息放入nhibernate映射文件的标记。这是一个很少使用和文档记录不好的特性。

    Documentation (对于Hibernate Java代码生成,但它可以用于其他任何东西)

    映射:

    <class name="Post" table="POSTS" xmlns="urn:nhibernate-mapping-2.2" >
      <meta attribut="bar">baz</meta>
    
      <property name="Body" type="String" column="BODY">
        <meta attribute="property-bar">property-baz</meta>
      </property>
    
      <!-- ... -->
    </class>
    

    您可以从配置中读取元标记

    foreach (PersistentClass persistentClass in Configuration.ClassMappings())
    {
      MetaAttributes attribute = persistentClass.GetMetaAttribute("bar");
      // ...
      foreach(Property property in persistentClass.PropertyIterator())
      {
        MetaAttributes propertyAttribute = property.GetMetaAttribute("property-bar");
        // ...
      }
    }