【问题标题】:XML Schema validationXML 模式验证
【发布时间】:2010-11-22 09:29:09
【问题描述】:

为什么这个 xml 模式不验证? Visual Studio 说 simpleContent 标签是无效标签。如果我随后删除该属性,则表示我的限制的基本类型在http://www.w3.org/2001/XMLSchema中未定义@

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >    
    <xs:complexType name="Person">
        <xs:attribute name="isProcessed" type="xs:boolean" />
        <xs:simpleContent>
            <xs:restriction base="xs:string">
                <xs:enumeration value="Male" />
                <xs:enumeration value="Female" />        
            </xs:restriction>
        </xs:simpleContent>    
    </xs:complexType>
</xs:schema>

@marc_s - 我尝试了代码按钮,但它一直在预览区域中隐藏所有 xml。我把空间放在那里,这样它就会显示出来。

xml 的最终结果应该是这样的

<person isprocessed="True" >Male</person>

没什么特别的。本质上,我正在尝试创建一个带有属性的 simpleType。但如果我正确理解 W3,属性只能应用于 complexTypes。所以我尝试创建一个里面有简单内容的 complexType。

【问题讨论】:

  • 查看您尝试使用此架构验证的源 xml 会很有帮助。
  • 此外,此架构文件中可能不需要存在空格。例如:标签应该读取 而不是 。这是问题中的复制/粘贴问题吗?
  • 修复了错误的空格 - @Matt:您需要突出显示您的代码或 XML 示例,然后单击工具栏中的“代码”按钮 - 上面有 0001010110101011011 的那个

标签: validation xsd


【解决方案1】:

好吧,根据W3 Schools XML Schema Tutorial,您尝试做的事情在 XML 模式的上下文中是无效的。

您只能将&lt;xs:restriction&gt; 应用于&lt;xs:simpleType&gt; - 不能应用于&lt;xs:complexType&gt; 内的&lt;xs:simpleContent&gt;

&lt;xs:simpleContent&gt; 可以包含 &lt;xs:extension&gt; 以扩展基本类型 - 但不是限制。

所以问题真的是:你想在这里完成什么?目标是什么,您想要验证的 XML 应该是什么样子??

马克

更新:

好的,要实现你想要的,试试这个 - 定义一个复杂类型(为了拥有属性),它包含一个简单的内容(这样你就可以拥有字符串值)并在简单中使用 xs:extension内容 - 不是 xs:restriction。所以基本上你定义了一个复杂的类型,它扩展了一个简单的字符串内容,并添加了一个属性:

      <xs:complexType>
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attribute name="isprocessed" type="xs:string" />
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>

为了做到这一点,我只是简单地创建了一个包含您想要的内容的“test.xml”文件,在 is 周围添加了一个人工&lt;root&gt;...&lt;/root&gt;(所以它是一个有效的 XML 文档),然后我运行了 Microsoft @ 987654330@ 工具可以从中创建 XML 架构(您也可以在 Visual Studio 2008 中执行相同操作 - 打开 XML 文件并从菜单中选择“XML > 创建架构”)。

希望这会有所帮助!

【讨论】:

  • 男/女限制怎么了?这肯定不是可以丢弃的模式类型的一部分吗?
  • true - 为此,需要有一个基于示例中的限制的简单类型
【解决方案2】:

我建议将您的类型分成两种不同的类型。它更清晰,并且可以正确验证:

<xs:complexType name="Person">
    <xs:simpleContent>
        <xs:extension base="Gender">
            <xs:attribute name="isProcessed" type="xs:boolean" />
        </xs:extension>
    </xs:simpleContent>    
</xs:complexType>

<xs:simpleType name="Gender">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Male" />
        <xs:enumeration value="Female" />        
    </xs:restriction>
</xs:simpleType>

我不确定如何将其表达为单一类型定义。

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 2013-05-22
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2010-10-25
    相关资源
    最近更新 更多