【问题标题】:"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】:
您可以使用<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");
// ...
}
}