3

この 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>
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 インスタンスの観点からは、3 つの有効なスキーマはすべて同等です。

于 2015-09-14T03:32:03.377 に答える
1

それは法的な計画です。問題は、xsdがすべての依存関係をトラバースしようとしていることです。MSバージョンはスキームを前処理し、すべてのグループを拡張します。循環依存のため、このような拡張は無限になり、エラーで終了します。モノバージョンでは、2つの考えられるシナリオがあります。

  1. 依存関係ツリーをトラバースしようとし、無限ループになります。
  2. すべてのグループを拡張しようとし、無限ループになります。

それは私の推測です。Monoxsdの実際のソースコードを見たことがありません。

于 2010-12-09T00:30:39.243 に答える
1

問題はおそらく、使用しているツールが、XML スキーマ仕様でサポートされているすべての可能性をサポートしていないことです。確かに、xsd.exe はすべてをサポートしているわけではありません。仕様は巨大であり、サポートするすべてのものからプログラミング言語へのマッピングを提供する価値はありません。

これを回避するには、生成する xml を模倣する一連の C# クラスを作成し、それらのクラスで xsd.exe を実行して xsd を生成することを試みることができます。必要なものをサポートする XML スキーマ構造が他にもある可能性があります。

于 2010-11-01T18:54:12.390 に答える
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 に答える