对于这个xml:
<elem1 xmlns="http://www.fixprotocol.org/ns/fast/t/1.0">
<elem2>
<elem2/>
</elem2>
</elem1>
我有这个模式,它似乎可以很好地对w3 schema validation service进行验证,并且模式可以很好地验证上面的XML。遗憾的是,xsd.exe和其他一些工具报告它是一个错误。那是对的吗? XML模式是否不允许循环组引用?谢谢!
更新:架构不是我的,不能改变它:(
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.fixprotocol.org/ns/fast/t/1.0" xmlns:t="http://www.fixprotocol.org/ns/fast/t/1.0">
<xs:element name="elem1">
<xs:complexType>
<xs:group ref="t:grp1" />
</xs:complexType>
</xs:element>
<xs:group name="grp1">
<xs:sequence>
<xs:group ref="t:grp2" />
</xs:sequence>
</xs:group>
<xs:group name="grp2">
<xs:sequence>
<xs:element minOccurs="0" name="elem2">
<xs:complexType>
<xs:group ref="t:grp1" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
</xs:schema>
答案 0 :(得分:2)
这个问题与最近讨论相同问题的许多问题有关:圆形组和微软的xsd.exe,因此我认为它应该得到回答,即使它很“旧”。
混淆是由于什么是循环组合。根据{{3}}规范:
“不允许使用循环组。即,在a的{粒子}内 任何深度都不得有{term}为的粒子 小组本身。“
基于以上所述,您的示例不是圆形组,因为该组本身不依赖于作为粒子。您的架构有效。
这是一个循环小组:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns="http://www.fixprotocol.org/ns/fast/t/1.0" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.fixprotocol.org/ns/fast/t/1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="elem1">
<xsd:complexType>
<xsd:group ref="grp1"/>
</xsd:complexType>
</xsd:element>
<xsd:group name="grp1">
<xsd:sequence>
<xsd:choice>
<xsd:group ref="grp1"/>
</xsd:choice>
</xsd:sequence>
</xsd:group>
</xsd:schema>
无法重写真正的循环组。但是,您的示例可以通过以下几种方式重写:下面的模式显示了基于递归复杂类型的等效内容模型。
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema xmlns="http://www.fixprotocol.org/ns/fast/t/1.0" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.fixprotocol.org/ns/fast/t/1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:annotation>
<xsd:documentation xmlns="">Generated from "Set1" under "Release2"</xsd:documentation>
</xsd:annotation>
<xsd:complexType name="grp1">
<xsd:sequence>
<xsd:element minOccurs="0" name="elem2" type="grp1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="elem1" type="grp1"/>
</xsd:schema>
看到以下架构实际上与xsd.exe一起使用也很“有趣”:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema xmlns="http://www.fixprotocol.org/ns/fast/t/1.0" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.fixprotocol.org/ns/fast/t/1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:annotation>
<xsd:documentation xmlns="">Generated from "Set1" under "Release2"</xsd:documentation>
</xsd:annotation>
<xsd:element name="elem1">
<xsd:complexType>
<xsd:group ref="grp1"/>
</xsd:complexType>
</xsd:element>
<xsd:group name="grp1">
<xsd:sequence>
<xsd:element minOccurs="0" name="elem2">
<xsd:complexType>
<xsd:group ref="grp1"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:group>
</xsd:schema>
从XML实例的角度来看,所有三个有效的模式都是等效的。
答案 1 :(得分:1)
问题可能是您使用的工具不支持XML架构规范支持的所有可能性。当然xsd.exe不支持所有内容。规范是巨大的,不值得提供从它支持的所有内容到编程语言的映射,特别是当某些事情没有很好地映射时。
要解决此问题,您可以尝试创建一组模拟要生成的xml的C#类,然后在这些类上运行xsd.exe以生成xsd。可能还有一些其他XML模式构造支持您想要的内容。
答案 2 :(得分:1)
这是一个法律计划。问题是xsd试图遍历所有依赖项。 MS版本预处理方案并扩展所有组。由于循环依赖性,这种扩展将是无限的,因此它会退出并出现错误。 Mono版本有两种可能的情况:
这只是我的猜测。我从未见过Mono xsd的实际源代码。
答案 3 :(得分:0)
我不知道组,但XSD.exe支持循环元素:
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Class1" nillable="true" type="Class1" />
<xs:complexType name="Class1">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="child" type="Class1" />
</xs:sequence>
</xs:complexType>
</xs:schema>