在每个字段级别具有元数据的XSD

在每个字段级别具有元数据的XSD,xsd,metadata,Xsd,Metadata,我的XML结构如下(只是大型XML的一部分) ... 例如,我需要为每个字段保留额外的元数据,以指示其是否可更新 我有两种方法 1) 在每个字段级别添加元数据。我觉得这使XSD过于复杂,因为每个元素现在都是一个对象 <Person> <firstName updatable="true" ... /> ... </Person> ... 2) 将元数据分离出来,如下所示 但是如何将元数据链接到数据?通过一个唯一的名字?使用XML的人可以轻

我的XML结构如下(只是大型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属性中的或作为类进行处理,两者都是这样
以上内容基本上是应用于XML的PSVI。Java也是如此(在搜索
如何从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>