1

我在我的项目中使用 MVVM 模式。我通过 XML 描述一个视图。但是我需要将它拆分成几个 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 Element 而不是属性?

像这样

<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进行。

另一种方法是使用两个不同的元素名称 - 例如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 回答