具有相同名称但不同子结构的元素的 XML 模式,具体取决于上下文 [英] XML schema for elements with same name but different sub-structure depending on context
问题描述
我尝试为收到的 XML 文档定义架构.
I try to define a schema for XML documents I receive.
文件看起来像:
<root>
<items>
<group name="G-1">
<item name="I-1"/>
<item name="I-2"/>
<item name="I-3"/>
<item name="I-4"/>
</group>
</items>
<data>
<group name="G-1" place="here">
<customer name="C-1">
<item name="I-1" count="3"/>
<item name="I-2" count="4"/>
</customer>
<customer name="C-2">
<item name="I-3" count="7"/>
</customer>
</group>
</data>
</root>
我尝试了 .NET 2.0 中的 XmlSpy 和 xsd.exe.两者都创建了允许在 <group>
下面有任意数量的 <item>
和 <customer>
元素的模式定义.但是我正在寻找的应该将 <items>
下面的 <group>
限制为 <item>
元素和 <data>
到 <customer>
元素下方的 <group>.
I tried XmlSpy and xsd.exe from .NET 2.0. Both created schema definitions which allow below <group>
any number of <item>
and <customer>
elements. But what I'm looking for should restrict <group>
below <items>
to <item>
elements, and <group>
below <data>
to <customer>
elements.
这是 xml 架构根本不具备的功能吗?
Is this something xml schema is not capable at all?
推荐答案
是的,XSD 可以处理这个问题.我从 Visual Studio 2008 生成了这个模式(比手动生成要快得多),它会满足你的需求:
Yes, XSD can handle this. I generated this schema from Visual Studio 2008 (much faster than doing it by hand) and it will do what you're looking for:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="items">
<xs:complexType>
<xs:sequence>
<xs:element name="group">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="item">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element name="group">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="customer">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="item">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="count" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="place" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这篇关于具有相同名称但不同子结构的元素的 XML 模式,具体取决于上下文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!