【问题标题】:"extend" an xml schema“扩展”一个 xml 模式
【发布时间】:2011-05-26 17:33:15
【问题描述】:

我正在尝试“扩展”一个 xml 模式(例如,这里是 nhibernate),以在其中添加我自己的实体。 我被困在“exm:foo”(和exm:foobar)实体上的验证阻塞的地步,因为“base”模式不允许这样做。在不更改基本架构的情况下,我怎样才能做到这一点?

示例:

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

【问题讨论】:

    标签: xml nhibernate-mapping xsd


    【解决方案1】:

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

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

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

    【讨论】:

    • 这并不完全正确。看我的回答。
    【解决方案2】:

    您可以使用&lt;meta&gt; 标记将附加信息放入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");
        // ...
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 2021-09-20
      • 2020-06-24
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多