1

プロジェクトでMVVMパターンを使用しています。ビューを XML で記述します。しかし、1 つの XML ファイルが大きすぎるため、複数の XML ファイルに分割する必要があります。

パーサーが XML を読み取ると、「ソース」属性が最初に見つかります。存在する場合、パーサーは他の XML ドキュメントをロードし、このドキュメントから要素を読み取ります。それ以外の場合、「ソース」属性が存在しない場合、パーサーは他の属性を読み取ります。

Source 属性の例:

<RibbonDefaultPageCategory>
  <RibbonPage
    Source="DefaultPageCategory/RibbonPage.xml"/>
</RibbonDefaultPageCategory> 

Source 属性のない例:

<RibbonDefaultPageCategory>
  <RibbonPage
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="_Schema.xsd"
    RibbonPageTitle="RibbonPageTitle">
     ...
   </RibbonPage>

XML スキーマでこの動作を定義することは可能ですか? 属性の代わりに XML 要素を使用することは可能でしょうか?

このような

<ExternalElement
    ElementName="RibbonPage"
    Path="DefaultPageCategory/RibbonPage.xml"/> 
4

2 に答える 2

2

属性ではできませんが、要素では可能です。このようなもの:

<xs:element name="RibbonPage">
  <xs:complexType>
    <xs:choice>
      <xs:element name="Source" type="xs:string"/>
      <xs:sequence>
        <xs:element name="RibbonPageTitle" type="xs:string"/>
        <!--
           ...place here the definiton of other elements defining the properties of 'RibbonPage'
        -->
      </xs:sequence>
    </xs:choice>
  </xs:complexType>
</xs:element>

どちらかを検証します

<RibbonPage>
  <Source>...</Source>
</RibbonPage>

また

<RibbonPage>
  <RibbonPageTitle>...</RibbonPageTitle>

</RibbonPage>

Sourceただし、両方をRibbonPageTitle同時に許可することはできません。

別の方法は、2 つの異なる要素名を使用することです。たとえばRibbonPageRef、定義が別の場所にありRibbonPage、値が要素自体にある場合です。

<xs:element name="RibbonDefaultPageCategory">
  <xs:complexType>
    <xs:choice>
      <xs:element name="RibbonPageRef">
        <xs:complexType>
          <xs:attribute name="Source" type="xs:string"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="RibbonPage">
        <xs:complexType>
          <xs:attribute name="RibbonPageTitle" type="xs:string"/>
          <!--
             ...
          -->
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>
</xs:element>

このように、有効な XML ファイルは次のとおりです。

<RibbonDefaultPageCategory>
  <RibbonPageRef Source="..."/>
</RibbonDefaultPageCategory>

また

<RibbonDefaultPageCategory>
  <RibbonPage RibbonPageTitle="..."/>
</RibbonDefaultPageCategory>
于 2013-04-09T15:09:01.937 に答える
0

スキーマ検証の前に変換を行う可能性を見落としがちです。処理パイプラインがある場合、多くの場合、検証ステップの前にある種の「正規化」ステップを設けることが非常に合理的です。主な欠点は、ソース ドキュメントに関して検証エラーの原因を特定するのが難しくなることです。

于 2013-04-09T14:01:03.787 に答える