我正在尝试将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)和复杂(点)的组合。
如果我只有简单类型,我知道我可以轻松使用联合。
所以我尝试了选择选项。
问题是,我不能对所有元素使用相同的名称(值)
有人可以帮我解决这个问题吗?
答案 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)
如果您不介意使用int
和string
的特定类型,这里有一个可能的解决方案可以验证以下正确的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
类型是混合内容。