Xsd 模式中的XML模式
简而言之,“我能在一个模式中定义一个可以作为一个整体进行验证的模式吗?” 说明: 是否可以为以下XML定义架构。我需要为“customer”定义架构。“customertype”子元素本身就是架构。在customertype中,我应该有一个名为“Source”的元素,这是必需的Xsd 模式中的XML模式,xsd,Xsd,简而言之,“我能在一个模式中定义一个可以作为一个整体进行验证的模式吗?” 说明: 是否可以为以下XML定义架构。我需要为“customer”定义架构。“customertype”子元素本身就是架构。在customertype中,我应该有一个名为“Source”的元素,这是必需的 <customer> <customername>acustomer</customername> <customertype> <xs
<customer>
<customername>acustomer</customername>
<customertype>
<xs:schema>
<xs:element name="profession">
<xs:complexType>
<xs:sequence>
<xs:element name="Source" type="xs:int" />
<xs:element name="ProfessionName" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
</customertype>
</customer>
针灸师
是否可以定义此xml的架构以满足所有要求?可以导入并使用其他架构创建架构。这将使用包含架构的
customertype
定义customer
元素:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://xml.netbeans.org/schema/Notes"
xmlns:tns="http://xml.netbeans.org/schema/Notes"
elementFormDefault="qualified">
<xsd:import namespace="http://www.w3.org/2001/XMLSchema"/>
<xsd:element name="customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="customername" type="xsd:string"/>
<xsd:element name="customertype">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="xsd:schema"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
问题是在customertype
schema上有一个附加条件,因此理论上应该获得标准XSD schema并对其进行修改,但是在schema定义中有许多不同的方法来满足该条件,因此进行这种“修改”是非常棘手的(可能是不可能的)
可能更好的方法是限制
customertype
中可能使用的模式(例如,它必须是直接指定复杂类型的单个元素定义等)然后编写XSD模式的子集来描述这个受限模式定义。正如Mimo所指出的,将customertype(或其他元素)定义为包含XSD名称空间中的元素是没有问题的,这似乎是您要问的
但是,如果您的目标是能够验证客户元素(或专业元素,这是您的示例中的模式所声明的),那么很难想象一个验证体系结构是最好的方式(甚至是可行的方式)一个原因是,根据被验证实例提供的模式信息验证文档实例不会产生与根据已知模式验证相同的数据清洁度信心。(设身处地让对手破坏您的验证并说服您的系统接受虚假数据作为有效数据。如果对手能够指定什么是有效文档实例,那么知道文档是有效的有多大用处?)
是什么阻止您编写模式并以常规方式使用它
[此外,2012年10月15日,在OP的评论之后]
如果我正确理解了您今天早些时候的评论,您的要求是允许除您之外的其他人随意指定customer
元素的类型,前提是该类型必须包含名为Source的子元素,其类型将为xsd:int
。您不指定是否需要访问它们所使用的类型定义,所以我将尝试考虑需要的情况和不需要的情况。
下面介绍了使这种情况有效的三种方法
- 定义架构基本版本的“主”架构文档,以及
- 在不同情况下使用的一个或多个“辅助”架构文档
xsi:type
。您定义一个主模式文档,其中customer
元素具有命名类型;我将假定该类型命名为customer
。customer
类型接受第一个子元素命名为Source
的任何元素。例如:
<xs:element name="customer" type="Customer"/>
<xs:complexType name="Customer">
<xs:sequence>
<xs:element name="Source" type="xs:int"/>
<xs:any minOccurs="0"
maxOccurs="unbounded"
processContents="lax"/>
</xs:sequence>
<xs:anyAttribute processContents="lax"/>
</xs:complexType>
这是客户类型的法律限制,因此Customer
元素可以使用它。因此,文档实例可能包含如下元素:
<customer xsi:type="Customer-for-us">
<Source>83760273</Source>
<name>Willy Wonka</name>
<address> ... </address>
<phone> ... </phone>
</customer>
83760273
威利旺卡
...
...
该文档根据其辅助模式文档以及主模式文档构建的模式进行验证,因此以通常的方式强制执行类型Customer for us
的定义
通过使用通配符和lax验证,客户类型确保用户可以在其类型版本中执行任何他们喜欢的操作,只要第一个子项命名为Source并且具有int类型
(2) 第二种方法是在主模式文档中使用一个洞
您可以像以前一样编写主架构文档,包括将customer
元素声明为具有类型customer
。但是主架构文档不包含该类型的声明。相反,您可以在辅助架构文档中声明客户类型,该文档在验证时与主架构文档组合以通常的方式告诉我(我建议您使用第三个模式文档作为驱动程序,并包括其他两个,但有许多方法可以使其工作)
同时,想要更具体的客户类型的用户,根据第一个子命名源等的兼容性约束,为客户类型编写自己的声明。用户使用自己的驱动程序文件,该文件将主架构文档和辅助架构文档的版本嵌入到自己的decla中客户类型的比率
这样,就不需要使用xsi:type
属性
(3) 第三种方法使用xs:redefinite
或(在XSD1.1中)xs:override
功能
您可以按照解决方案(1)中所述编写主架构文档。用户可以使用xs:redefinite
或xs:override
根据自己的意愿重新定义客户。这个答案已经很长了,因此我不建议在
<customer xsi:type="Customer-for-us">
<Source>83760273</Source>
<name>Willy Wonka</name>
<address> ... </address>
<phone> ... </phone>
</customer>