如何添加父“包装器”元素并在现有架构中验证它们

时间:2014-02-16 01:57:50

标签: xml xsd

我创建了一个验证我的xml实例的xml架构。因为我已经研究了一段时间,所以我一直在评论一小段xml代码,以简化我对xml架构的学习。我目前有一个有效的架构,具有以下结构:

 <xsd:element name="singer" type="singerType"/> 
 <xsd:complexType name="singerType">
   <xsd:sequence>
     <xsd:element name="singer_id">
     ....
   ....
 ....

但现在我的xml文件具有这种结构

<element1>
    <element2 id="1">
        <singer>
            <singer_id>

我想要做的是将element1element2合并到我现有的架构中。这两个元素都是复杂的类型,我尝试用几种不同的方式来做,但一直都有错误。有人能指出我正确的方向,如何将这2个元素添加到我的架构中吗?

1 个答案:

答案 0 :(得分:0)

我必须在这里做一些假设,因为你没有包含足够的代码示例。如果这不能解答您的问题,请修改您的问题,添加更多详细信息。

你有一个像这样的XML:

<?xml version="1.0" encoding="UTF-8"?>
<element1 xmlns="http://your.target.namespace/singer"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://your.target.namespace/singer schema.xsd">
    <element2 id="1">
        <singer>
            <singer_id>123</singer_id>
        </singer>
        <singer>
            <singer_id>456</singer_id>
        </singer>
    </element2>
    <element2></element2>
    <element2>
        <singer>
            <singer_id>789</singer_id>
        </singer>
    </element2>
</element1>

您可以使用此架构验证它:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://your.target.namespace/singer"
           xmlns="http://your.target.namespace/singer"
           elementFormDefault="qualified">

    <xs:element name="singer" type="singerType"/>
    <xs:complexType name="singerType">
        <xs:sequence>
            <xs:element name="singer_id" type="xs:token" />
        </xs:sequence>
    </xs:complexType>

    <xs:element name="element1">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="element2" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element ref="singer" minOccurs="0" maxOccurs="unbounded" />
                        </xs:sequence>
                        <xs:attribute name="id" type="xs:token" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

您可能希望以不同的方式组织它,当然,如果您打算使用它们,则按名称公开复杂类型,或者如果您希望在其他地方使用它,则在顶层定义element2