是否可以使用XSD定义增量指定的树结构?

时间:2013-04-25 16:23:17

标签: xml validation graph tree xsd

假设我们有一个元素,它既可以是叶子(包含某个值),也可以是复合(通常的复合模式)。我想模拟预期由其他实例改进的树实例,例如通过用新元素填充复合节点。我希望能够通过其结构来决定一个树实例是否符合另一个实例。是否可以将实例建模为XSD并实现符合XSD的符合其他XSD的一致性?请注意,不仅仅有两个级别 - 每个结构都可以作为元结构。

附录:为了更好地了解意图,这里有一些可能的规则。

  • “此复合材料不可扩展(已修复)。”
  • “您可以在此合成的末尾添加元素。”
  • “此合成包含可选的叶子1和必需的叶子2。”
  • “此合成包含任意数量的合成。”

示例:

Structure 1:
composite
    0..1 "abc"
    1..n "def"
    0..n extensible composite "c1"
        1..1 "ghi"
    0..1 composite "c2"
        1..1 "jkl"

Structure 2:
composite
    1..1 "def"
    1..1 "def"
    1..1 "def"
    1..1 extensible composite "c1"
        1..1 "ghi"
        1..n "extension"
    1..n extensible composite "c1"
        1..1 "ghi"

Structure 3:
composite
    0..n "abc" //too many "abc"s
    //"def" needed
    0..1 composite "c2"
        1..1 "jkl"
        1..1 "mno" //forbidden extension

第二个结构符合第一个结构,第三个结构不符合第一个结构。我想也许可以用模式验证来表达。

1 个答案:

答案 0 :(得分:1)

如果你正在发现XSD,那么首先要制作一堆XML文件,代表你想要实现的目标,将它们同时提供给一个可以生成一个(或多个)XSD文件的工具(取决于您是否使用多个名称空间)。一旦你在XSD中有了合理的基础,你就可以手动解决这个问题。

这是我根据你的澄清尝试过的。

Sample1.xml

<composite>
    <abc/>
    <def/>
    <c1>
        <ghi/>
    </c1>
    <c1>
        <ghi/>
    </c1>
    <c2>
        <jkl/>
    </c2>
</composite>

Sample2.xml

<composite>
    <def/>
    <def/>
    <c1>
        <ghi/>
        <extension/>
    </c1>
    <c1>
        <ghi/>
    </c1>   
</composite>

基于以上所述,原始生成的XSD是:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="composite">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="abc" type="xs:anyType" />
        <xs:element maxOccurs="unbounded" name="def" type="xs:anyType" />
        <xs:element maxOccurs="unbounded" name="c1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ghi" type="xs:anyType" />
              <xs:element minOccurs="0" name="extension" type="xs:anyType" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element minOccurs="0" name="c2">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="jkl" type="xs:anyType" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

需要进行一些调整,因为您所描述的所有基数场景都没有被XML捕获。以下是更新的图表,以便更轻松地与原始标记进行对帐。

enter image description here

应该更容易看出XSD如何与您所问的相匹配(未显示基数,假设(1..1) - 这是XSD中粒子的默认值。)

如何进一步定义扩展,可能通过使用其他机制(如通配符元素)或约束为基于类型,是基于进一步要求要完成的活动。如果您正在进入更复杂的场景,例如基于其他元素存在或值(共同约束)强制存在,那么XSD 1.0可能无法工作......

这应该让你开始至少为你的问题提供额外的细节......