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

时间:2013-04-12 18:17:43

标签: xsd metadata

我有如下所示的XML结构(只是大型XML的一部分)

<Person>
<firstName>
<lastName>
<Partner>
   <firstName>
...
</Person>

我需要为每个字段保留额外的元数据,例如,以指示其是否可更新

我有两种方法

1)在每个FIELD级别添加元数据。我觉得这会使XSD过于复杂,因为每个元素现在都是一个OBJECT

<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>
我认为这类似于 Add metadata to an XSD definition 但它没有任何答案

1 个答案:

答案 0 :(得分:0)

我的(可能是修辞)问题就是为什么有人想要看到每个XML的元数据,如果它与模型的关系是静态的?

我将向您展示一个UBL XSD片段(XML命名空间被视为不相关):

 <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注释机制的机制,用于实现与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示例(文档与appinfo)不同,但两者都使用XSD注释机制。

JAXB的自定义绑定还支持一种模型,其中自定义绑定与XSD分离(在它们自己的单独XML文件中)。自定义绑定文件(在您的情况下为元数据)与XSD(在您的情况下为XML)之间的关联是通过XPath匹配完成的。

这带来了另一个澄清:你想到的处理模式是什么?动态(即元模型是静态的,但可以应用于任意XSD)?平台?以下是一个解决方案,如果碰巧与您的平台匹配,可以动态的方式满足您的需求。

.NET:

以上基本上是PSVI应用于您的XML。 Java也是如此(在此Xerces page上搜索How do I retrieve PSVI from the DOM?)...

我也可以为XSLT设计解决方案,或者根本不涉及XSD ...但上述内容应该足以让您入门。