xsd:相同的元素名称,不同的类型(简单和复杂)

时间:2013-05-27 13:59:56

标签: xml xsd schema xsd-validation

我正在尝试将xsd文件写入以下情况:

<Values xsi:type="me:ArrayOfValue">
   <Value xsi:type="xs:int">1</Value>
   <Value xsi:type="xs:string">I'm a string</Value>
   <Value xsi:type="me:Point">
      <X>10.2</X>
      <Y>2.3</y>
   </Value>
<Values/>

我这里有简单类型(int,string)和复杂(点)的组合。

如果我只有简单类型,我知道我可以轻松使用联合

所以我尝试了选择选项。

问题是,我不能对所有元素使用相同的名称(值)

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

为了便于阅读,下面是一个稍微修改过的XML(它不会改变答案的真实性,只是让它更容易阅读,因为我不必列出两个XSD)。

<Values xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <Value xsi:type="xs:int">1</Value>
   <Value xsi:type="xs:string">I'm a string</Value>
   <Value xsi:type="Point">
      <X>10.2</X>
      <Y>2.3</Y>
   </Value>
</Values>

此XSD将验证以上内容:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema xmlns:me="urn:tempuri-org" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Values">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" name="Value"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="Point" >
    <xsd:sequence minOccurs="0">
      <xsd:element name="X" type="xsd:decimal" />
      <xsd:element name="Y" type="xsd:decimal" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

问题是,即使你不想要日期,它也是一个使用xsi:type =“xs:date”的值。但这只是XSD 1.0的一个限制。

要限制允许的xsi:type属性列表,您必须移至XSD 1.1或在XSD 1.0处理器之上使用Schematron约束。

答案 1 :(得分:0)

如果您不介意使用intstring的特定类型,这里有一个可能的解决方案可以验证以下正确的XML文件(您的文档存在一些问题):

XML文件

<me:Values xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:me="me">
    <me:Value xsi:type="me:int">1</me:Value>
    <me:Value xsi:type="me:string">I'm a string</me:Value>
    <me:Value xsi:type="me:Point">
        <me:X>10.2</me:X>
        <me:Y>2.3</me:Y>
    </me:Value>
</me:Values>

验证它的XML架构

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="me" xmlns:me="me" elementFormDefault="qualified">
        <xs:element name="Values">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="me:Value" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="Value" type="me:myType"/>

        <xs:complexType abstract="true" name="myType" mixed="true"/>

        <xs:complexType name="Point" mixed="true">
            <xs:complexContent>
                <xs:extension base="me:myType">
                    <xs:sequence>
                        <xs:element name="X" type="xs:decimal"/>
                        <xs:element name="Y" type="xs:decimal"/>
                    </xs:sequence>                
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
        <xs:complexType name="string" mixed="true">
            <xs:simpleContent>
                <xs:restriction base="me:myType">
                    <xs:simpleType>
                        <xs:union memberTypes="xs:string"/>
                    </xs:simpleType>
                </xs:restriction>
            </xs:simpleContent>
        </xs:complexType>
        <xs:complexType name="int" mixed="true">
            <xs:simpleContent>
                <xs:restriction base="me:myType">
                    <xs:simpleType>
                        <xs:union memberTypes="xs:int"/>
                    </xs:simpleType>
                </xs:restriction>
            </xs:simpleContent>
        </xs:complexType>
    </xs:schema>

一些解释

它才有效,因为我允许抽象类型myType的混合内容。这是(据我所知)将复杂类型限制为简单类型的唯一方法。缺点:您的Point类型是混合内容。