XSD:如何根据某些标签的值验证XML文件?

时间:2009-12-10 09:00:41

标签: xml schema xsd

我试图验证这个XML文件......  如果

  1. <tag1>为“Y”,然后<tag2>必须出现

  2. 如果<tag1>为“N”,则<tag2>不得出现..

    <parent>
      <a>
        <tag1>Y</tag1>
        <tag2>sometext</tag2>
      </a>
      <a>
        <tag1>N</tag1>
      </a>
    </parent>
    
  3. 我尝试了<choice>代码,但似乎没有用... :(我得出的结论是此功能在XSD中不可用..

    你能指导我至少实现这个的替代方案吗?顺便说一句,我使用的是Visual Studio 2005 ..

4 个答案:

答案 0 :(得分:6)

您无法使用XSD验证此类内容。

XML架构不是设计用于检查“标签内”关系,例如“如果tag1的值为'Y',则必须存在tag2” - 只是无法完成,抱歉。

如果您需要检查这些条件,则必须查看Schematron才能执行此操作。

答案 1 :(得分:3)

众所周知,这是XML模式的一个回顾。但我很感激您尝试<choice>标记的方法。如果您的条件是这样的话,它可能会成功:

  1. 如果需要<tag1>并且首先显示,则不需要<tag2>(并显示为第二个标记)
  2. 如果需要<tag2>并且首先显示,则不需要<tag1>(并显示为第二个)
  3. 代码是:

    <xs:element name="parent">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="a" maxOccurs="unbounded">
            <xs:complexType>
              <xs:choice>
                <xs:sequence>
                  <xs:element name="tag1" type="xs:boolean" />
                  <xs:element name="tag2" type="xs:string" minOccurs="0" />
                </xs:sequence>
                <xs:sequence>
                  <xs:element name="tag2" type="xs:string" />
                  <xs:element name="tag1" type="xs:boolean" minOccurs="0" />
                </xs:sequence>
              </xs:choice>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    

答案 2 :(得分:1)

不幸的是,使用XSD无法解决此问题。原因是XSD只能用于定义XML-Files的结构(语法)。你想要做的是将语法耦合到一些语义属性(一些TAG必须有一定的内容来决定附近某些TAGS的语法)。

答案 3 :(得分:0)

它不可能与XSD ..但顺便说一句,如果要求有点舒适,你可以解决像婴儿程序员这样的事情,如她的例子所示..