在每个字段级别具有元数据的XSD
我的XML结构如下(只是大型XML的一部分)在每个字段级别具有元数据的XSD,xsd,metadata,Xsd,Metadata,我的XML结构如下(只是大型XML的一部分) ... 例如,我需要为每个字段保留额外的元数据,以指示其是否可更新 我有两种方法 1) 在每个字段级别添加元数据。我觉得这使XSD过于复杂,因为每个元素现在都是一个对象 <Person> <firstName updatable="true" ... /> ... </Person> ... 2) 将元数据分离出来,如下所示 但是如何将元数据链接到数据?通过一个唯一的名字?使用XML的人可以轻
...
例如,我需要为每个字段保留额外的元数据,以指示其是否可更新
我有两种方法
1) 在每个字段级别添加元数据。我觉得这使XSD过于复杂,因为每个元素现在都是一个对象
<Person>
<firstName updatable="true" ... />
...
</Person>
...
2) 将元数据分离出来,如下所示
但是如何将元数据链接到数据?通过一个唯一的名字?使用XML的人可以轻松地链接它吗?
有更好的办法吗?谢谢
<data>
<Person>one
<firstName>
<lastName>
<Partner>
<firstName>
...
</Person>
<Person>two
<firstName>
<lastName>
<Partner>
<firstName>
...
</Person>
</data>
<metadata>
<field name="firstName" updateble="false"/>
....
</metadata>
一
...
二
...
....
我认为这与
但是它没有任何答案我(也许是修辞)的问题是,如果元数据与模型的关系是静态的,为什么有人希望看到每个XML都包含元数据
我将向您展示一个UBLXSD片段(XML名称空间被省略为不相关):
BBIE
应用程序响应。UBL版本标识符。标识符
此文档类型的UBL2模式的最早版本,它定义了当前实例中可能遇到的所有元素。
0..1
应用程序响应
UBL版本标识符
标识符
标识符。类型
2.0.5
你可以在这里看到,有很多结构化的数据可以很容易地作为与你的问题相关的东西传递。但从根本上说,这是一种使用XSD注释机制的机制,用于实现与XSD相关的事情。另一个是JAXB自定义绑定机制使用的:
<xsd:simpleType name="ZipCodeType">
<xsd:annotation>
<xsd:appinfo>
<jxb:javaType name="int" parseMethod="javax.xml.bind.DatatypeConverter.parseInt" printMethod="javax.xml.bind.DatatypeConverter.printInt"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="10000"/>
<xsd:maxInclusive value="99999"/>
</xsd:restriction>
</xsd:simpleType>
虽然这与UBL示例(documentation vs.appinfo)不同,但两者都使用XSD注释机制
JAXB的自定义绑定还支持一个模型,其中自定义绑定与XSD(在它们自己的单独XML文件中)是分开的。自定义绑定文件(案例中的元数据)和XSD(案例中的XML)之间的关联是通过XPath匹配完成的
这带来了另一个澄清:您心目中的处理模型是什么?动态(即元模型是静态的,但可以应用于任意XSD)?站台下面是一个解决方案,如果它恰好与您的平台相匹配,它可以以动态的方式满足您的需要
.NET:
- 按照我上面提到的方式构建XSD(即某种注释)
- 在运行时,根据此XSD验证XML。然后,每个节点都将填充属性。在中使用类可以轻松地将SchemaInfo属性中的或作为类进行处理,两者都是这样李>
如何从DOM中检索PSVI?
)
我也可以想象XSLT的解决方案,或者根本不涉及XSD。。。不过,以上内容应该足以让您开始使用。它也不仅仅是一个元数据属性(“可更新”),它可以是许多相似的对。相对于描述XML的模型,此元数据是静态的,还是特定于XML的实例?请澄清,我会给你我的意见…静态的关系模型佩特罗。谢谢你的详细回答佩特罗。但我想我误解了你的“静态vs动态”问题,对不起,我误解了你。元数据来自数据库,即其动态数据库。但是对于给定的类型也是一样的
我的意思是可以有几个实例,但是它们都具有相同的元数据
我现在决定通过字段方法将数据和元数据保持在一起。
<xsd:element ref="cbc:UBLVersionID" minOccurs="0" maxOccurs="1">
<xsd:annotation>
<xsd:documentation>
<ccts:Component>
<ccts:ComponentType>BBIE</ccts:ComponentType>
<ccts:DictionaryEntryName>Application Response. UBL Version Identifier. Identifier</ccts:DictionaryEntryName>
<ccts:Definition>The earliest version of the UBL 2 schema for this document type that defines all of the elements that might be encountered in the current instance.</ccts:Definition>
<ccts:Cardinality>0..1</ccts:Cardinality>
<ccts:ObjectClass>Application Response</ccts:ObjectClass>
<ccts:PropertyTerm>UBL Version Identifier</ccts:PropertyTerm>
<ccts:RepresentationTerm>Identifier</ccts:RepresentationTerm>
<ccts:DataType>Identifier. Type</ccts:DataType>
<ccts:Examples>2.0.5</ccts:Examples>
</ccts:Component>
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:simpleType name="ZipCodeType">
<xsd:annotation>
<xsd:appinfo>
<jxb:javaType name="int" parseMethod="javax.xml.bind.DatatypeConverter.parseInt" printMethod="javax.xml.bind.DatatypeConverter.printInt"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="10000"/>
<xsd:maxInclusive value="99999"/>
</xsd:restriction>
</xsd:simpleType>