3

对于这个 xml:

<elem1 xmlns="http://www.fixprotocol.org/ns/fast/t/1.0">
 <elem2>
   <elem2/>
 </elem2>
</elem1>

我有这个架构,它似乎可以很好地针对w3 架构验证服务进行验证,并且该架构可以很好地验证上述 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>
4

4 回答 4

2

这个问题与最近讨论相同问题的许多问题相关联:循环组和 Microsoft 的 xsd.exe,因此我认为应该回答它,即使它很“旧”。

混淆是由符合循环组的条件引起的。根据XSD规范的第3.8.6节:

“不允许使用圆形组。也就是说,在一个组的 {particles} 内,不得有任何深度的粒子,其 {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 实例的角度来看,所有三个有效模式都是等价的。

于 2015-09-14T03:32:03.377 回答
1

问题可能是您使用的工具不支持 XML 模式规范支持的所有可能性。当然 xsd.exe 并不支持所有内容。该规范非常庞大,不值得提供从它支持的所有内容到编程语言的映射,尤其是当有些东西映射得不是很好时。

要解决此问题,您可以尝试创建一组模仿您要生成的 xml 的 C# 类,然后在这些类上运行 xsd.exe 以生成 xsd。可能还有一些其他 XML 模式构造支持您想要的。

于 2010-11-01T18:54:12.390 回答
1

这是一个合法的计划。问题是 xsd 正在尝试遍历所有依赖项。MS 版本预处理方案并扩展所有组。由于循环依赖,这种扩展将是无限的,因此它会因错误而退出。Mono 版本有两种可能的情况:

  1. 它试图遍历依赖树并最终陷入无限循环。
  2. 它试图扩展所有组并最终陷入无限循环。

这只是我的猜测。我从未见过 Mono xsd 的实际源代码。

于 2010-12-09T00:30:39.243 回答
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>
于 2017-04-07T18:30:12.503 回答