2011-08-23 72 views
0

在我编写应用程序的框架中,有许多xml文件,其中节点名称并不重要。所有有价值的信息都放在属性中。节点类型是通过其中一个属性定义的。仅定义属性的XSD架构

我想写这个文件的简单架构。我认为它应该满足两大条件:

  • 每一个元素可以从定义的列表属性(例如名称,值类型[会有更多!])
  • 每一个元素可以拥有的元素序列确切的定义

如果有可能使属性列表依赖于某些给定的(例如类型)参数,它将是非常有用的。

XSD文件可以处理这些XML文件吗?是否有可能编写这样的模式?如何定义任何节点的属性列表。

回答

0

您需要为xml实例中要支持的每个可能的元素和属性组合定义XSD类型。例如

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:all> 
     <!-- declarations of any of the types you can use --> 
     <xs:element name="MyType1" type="MyType1Type" /> 
     <!-- etc.. --> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 
    <!-- Type definitions --> 
    <xs:complexType name="MyType1> 
    <xs:sequence> 
     <xs:element name="MyElement1" type="xs:string" /> 
     <xs:element name="MyElement2" type="xs:date" /> 
     <!-- etc.. --> 
    </xs:sequence> 
    <xs:attribute name="MyAttribute1" type="xs:string" /> 
    <!-- etc.. --> 
    </xs:complexType> 
    <xs:complexType name="MyType2> 
    <xs:sequence> 
     <xs:element name="MyElement3" type="xs:string" /> 
     <xs:element name="MyElement4" type="xs:date" /> 
     <!-- etc.. --> 
    </xs:sequence> 
    <xs:attribute name="MyAttribute3" type="xs:string" /> 
    <!-- etc.. --> 
    </xs:complexType> 
    <!-- etc.. --> 
</xs:schema> 

一旦你定义了所有可能的类型,那么你可以支持任何xml文件。

希望这有助于

编辑:或者使用的xs:anyType类型。

+0

不幸,正如我所说的节点名称不提供任何信息。开发人员可以绝对插入这里所有的定义元素名单是不可能的。 –

+0

然后你需要使用xs:anyType类型。 –

+0

你能提供我提到的条件的例子吗? –

0

您可以拥有一个只定义了一个complexType的模式,其中包含所有的属性。您的挑战是找到一个模式处理器,它的API允许您请求针对该指定类型的给定输入元素的验证。这样做的一个方法是使用感知模式的XSLT处理器(以及产生大量的输出,你可以放弃的)

<xsl:template match="*"> 
    <xsl:copy-of select="." type="my-complex-type"/> 
    <xsl:apply-templates/> 
</xsl:template> 

将验证对您的类型声明的文档中的每个元素

+0

我的可能性是有限的,因为我只扩展当前只处理xsd的现有类。太糟糕了:( –