1

ネストされた2つのxsdがあります:

DefaultSchema.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="DefaultSchema"
    targetNamespace="http://myNamespace.com/DefaultSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://myNamespace.com/DefaultSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:complexType name="ZForm">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Part" minOccurs="0" maxOccurs="unbounded" type="Part"/>
    </xs:sequence>
    <xs:attribute name="Title" use="required" type="xs:string"/>
    <xs:attribute name="Version" type="xs:int"/>
  </xs:complexType>

  <xs:complexType name="Part">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Label" type="Label" minOccurs="0"></xs:element>
    </xs:sequence>
    <xs:attribute name="Title" use="required" type="xs:string"/>
  </xs:complexType>
  <xs:complexType name="Label">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="Title" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:schema>

ExportSchema.xsd: (これは、DefaultSchema のメイン要素 (ZForm) の周りにもう 1 つの要素 (ZForms) をラップするようなものです)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ExportSchema"
    targetNamespace="http://myNamespace.com/ExportSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://myNamespace.com/DefaultSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:es="http://myNamespace.com/ExportSchema.xsd"
>
  <xs:import namespace="http://myNamespace.com/DefaultSchema.xsd" schemaLocation="DefaultSchema.xsd"/>

  <xs:element name="ZForms" type="es:ZFormType"></xs:element>

  <xs:complexType name="ZFormType">
    <xs:sequence>
      <xs:element name="ZForm" type="ZForm" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

そして最後に、生成された xmlがあります。

<?xml version="1.0" encoding="utf-8"?>
<ZForms xmlns="http://myNamespace.com/ExportSchema.xsd">
  <ZForm Version="1" Title="FormTitle">
    <Part Title="PartTitle" >
      <Label Title="LabelTitle" />
    </Part>
  </ZForm>
</ZForms>

Visual Studio は、「パーツ」が何であるかがわからないと不平を言っています。
ExportSchema.xsd には DefaultSChema.xsd への参照があるため、この xml を検証するために xml 名前空間プレフィックス (..) を使用する必要がないことを望んでいました。

DefaultSchema.xsd を明示的に指定せずにその xml 構造を有効にする方法はありますか? それともこれはいけませんか?

4

2 に答える 2

1

ベーススキーマに変更importすると、これを (名前空間プレフィックスなしで) 機能させることができます。include

ExportSchema.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ExportSchema"
    targetNamespace="http://myNamespace.com/DefaultSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://myNamespace.com/DefaultSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    <xs:include schemaLocation="DefaultSchema.xsd" />

    <xs:element name="ZForms" type="ZFormType"></xs:element>

    <xs:complexType name="ZFormType">
        <xs:sequence>
            <xs:element name="ZForm" type="ZForm" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

注: これには、ターゲットの名前空間を DefaultSchema.xsd に変更する必要もあります。

xsd:import の MSDN から:

include要素とimport要素 の違いは、import要素は異なるターゲット名前空間を持つスキーマ ドキュメントからスキーマ コンポーネントへの参照を許可し、include 要素は同じターゲット名前空間を持つ (または指定されたターゲット名前空間がない) 他のスキーマ ドキュメントからスキーマ コンポーネントを追加することです。 ) を含むスキーマに。つまり、インポート要素を使用すると、任意のスキーマからスキーマ コンポーネントを使用できます。include 要素を使用すると、含まれるスキーマのすべてのコンポーネントを含むスキーマに追加できます。

DefaultSchema.xsd (お使いのバージョンでの変更はありません)

Test.xml

<?xml version="1.0" encoding="utf-8"?>
<ZForms 
    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
    xs:schemaLocation="http://myNamespace.com/DefaultSchema.xsd ExportSchema.xsd" 
    xmlns="http://myNamespace.com/DefaultSchema.xsd">
  <ZForm Version="1" Title="FormTitle">    
    <Part Title="PartTitle" >      
      <Label Title="LabelTitle" />      
    </Part>
  </ZForm>
</ZForms>

この組み合わせは効きそうです..

于 2012-06-29T09:11:31.803 に答える
0

スキーマ ドキュメント DefaultSchema には targetNamespace="http://myNamespace.com/DefaultSchema.xsd" が含まれているため、ZForm、Part、および Label 要素がこの名前空間にある必要があると言っています。しかし、あなたのインスタンスでは、これらの要素はこの名前空間にありません。したがって、インスタンスはこのスキーマに対して有効ではありません。

于 2012-06-29T11:37:09.230 に答える