XSD架构是否允许循环组?

XSD架构是否允许循环组?,xsd,xsd.exe,circular-reference,Xsd,Xsd.exe,Circular Reference,对于此xml: <elem1 xmlns="http://www.fixprotocol.org/ns/fast/t/1.0"> <elem2> <elem2/> </elem2> </elem1> 我有这个模式,它似乎可以很好地验证,并且该模式可以很好地验证上面的XML。不幸的是,xsd.exe和其他一些工具报告这是一个错误。对吗?XML模式是否允许循环组引用?谢谢 更新:架构不是我的,无法更改:( 问题可能在于,您使

对于此xml:

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

我有这个模式,它似乎可以很好地验证,并且该模式可以很好地验证上面的XML。不幸的是,xsd.exe和其他一些工具报告这是一个错误。对吗?XML模式是否允许循环组引用?谢谢

更新:架构不是我的,无法更改:(


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


为了解决这个问题,您可以尝试创建一组模拟要生成的xml的C#类,然后在这些类上运行xsd.exe以生成xsd。可能还有其他一些xml模式构造支持您所需的内容。

这是一个合法方案。问题是xsd试图遍历所有依赖项。MS版本E处理方案并扩展所有组。由于循环依赖性,此类扩展将是无限的,因此会出现错误。对于Mono版本,有两种可能的情况:

  • 它尝试遍历依赖关系树 最终形成一个无限循环
  • 它试图扩展所有组和组 在无限循环中结束

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

    这个问题与许多最近讨论同一问题的问题联系在一起:循环组和Microsoft的xsd.exe,因此我认为应该回答这个问题,尽管它很“旧”

    这种混淆是由一个圆形组引起的。根据章节规范:

    “圆形群是不允许的。也就是说,在a的{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> 
    
    
    从“Release2”下的“Set1”生成
    
    看到以下模式实际上可以与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>
    
    
    从“Release2”下的“Set1”生成
    

    从XML实例的角度来看,所有三个有效模式都是等效的。

    我不知道关于组的情况,但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>
    
    
    
    是的,David,这就是问题所在,但我需要找出XSD规范是否允许这样做,并可能帮助Mono团队解决这个问题(他们的XSD.exe工具挂起)。我希望我可以更改架构,但像往常一样-这是一个组织的公共架构,而不是我的:)。我试图阅读规范,但被他们的语言弄糊涂了,所以希望有人知道答案。xsd.exe的错误是什么?错误:为架构“tmp”生成类时出错targetNamespace=“…”中的组“grp2”具有无效的定义:循环组引用。如果这是XSD错误,我可以尝试联系负责该错误的组织,并告诉他们错误。如果没有,我将尝试寻找一个替代的代码生成器,或者尝试修复mono的xsd.exe中的错误(挂起而不是显示错误)。Microsoft在的答复是这不是一个有效的架构。你能详细说明一下吗?我怀疑他们错了,但我不确定。
    <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>