2010-10-29 76 views
2

对于这个XML:XSD模式允许循环组?

<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

什么是XSD.EXE错误? – 2010-11-02 19:03:49

+0

错误:为模式'tmp'生成类时出错。 - 来自targetNamespace的组'grp2'='...'的定义无效:循环组引用。 如果这是一个XSD错误,我可以尝试联系负责它的组织,并告诉他们一个错误。如果没有,我会尝试找到一个替代的代码生成器,或尝试修复单声道的xsd.exe中的错误(挂起而不是显示错误)。 – Yurik 2010-11-03 14:30:39

回答

0

问题可能是您正在使用不支持XML模式规范支持的所有可能的工具当然可以。 xsd.exe并不支持所有的东西,规范是巨大的,它不值得提供它支持的所有东西到编程语言的映射,特别是当某些东西映射不好时。 ,您可以尝试创建一组模拟您想要生成的xml的C#类,然后在这些类上运行xsd.exe以便属于te xsd。可能有一些其他的XML模式构造支持你想要的。

+0

是的大卫,这是问题,但我需要找出它是否被XSD规范允许,并可能帮助Mono团队解决此问题(他们的xsd.exe工具挂起)。我希望我可以改变架构,但像往常一样 - 它是来自组织的公共架构,而不是我的:)。我试图阅读规范,但他们的语言很困惑,所以希望有人知道答案。 – Yurik 2010-11-02 18:59:10

1

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

  1. 它试图遍历依赖关系树 和无限循环结束。
  2. 它试图展开所有团体和 无限循环结束。

这只是我的猜测。我从来没有看到Mono xsd的实际源代码。

+0

微软在https://connect.microsoft.com/VisualStudio/feedback/details/637855上的回应是,这不是一个有效的模式。你能详细说明一下吗?我怀疑他们错了,但我不确定。 – Yurik 2011-05-12 22:33:35

1

这个问题正在与谈论同样的问题,最近许多问题链接:圆形组,和微软的XSD.EXE,所以我觉得应该来回答,即使是很“老”。

这种混淆是通过为圆形组什么资格引起的。据部分3.8.6 of the XSD规格:

"Circular groups are disallowed. That is, within the {particles} of a group there must not be at any depth a particle whose {term} is the group itself."

基于上述,你的例子不是圆形组,由于该组本身不依赖于自身作为粒子。您的架构有效

这是一个圆形的基团:

<?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实例的角度来看,所有三个有效的模式是等价的。

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>