XML Schema如何用无子元素编写字符串

时间:2014-03-31 15:28:44

标签: xml xsd xml-dtd

我有一个XML文件。我正在尝试生成xsd架构文件。我的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<recipe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="sample.xsd" id="62378">

  <title>Beans On Toast</title>
  <ingredients>
     <item quantity="1" unit="slice">bread</item>
     <item quantity="1" unit="can">bakedbeans</item>        
  </ingredients> 
</recipe>

我的架构文件是:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="recipe" type="recipeType"/>
<xs:complexType name="recipeType">
    <xs:sequence>
        <xs:element name="title" type="xs:string"/>
        <xs:element name="ingredients" type="ingredientsType"/>           
    </xs:sequence>
    <xs:attribute name="id" type="xs:integer"/>
</xs:complexType>

<xs:complexType name="ingredientsType">
    <xs:sequence>
        <xs:element name="item" type="itemType"/>
    </xs:sequence>    
</xs:complexType>          

<xs:complexType name="itemType">
    <xs:attribute name="quantity" type="xs:integer"/>
    <xs:attribute name="unit" type="xs:string"/>
</xs:complexType>    
</xs:schema>

我在验证时遇到错误。我知道原因。因为我无法定义元素项type = xs:string,因为我必须为属性编写complexType(“itemType”)。有人可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

如果您需要属性,则必须使用complexType。但是,如果您还需要简单的内容,那么您可以将complexType定义为包含simpleContent,并使用基本简单类型使用属性对其进行扩展

在你的情况下,你可以这样做:

<xs:complexType name="itemType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute name="quantity" type="xs:integer"/>
            <xs:attribute name="unit" type="xs:string"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

这将允许:

<item quantity="1" unit="slice">bread</item>

您仍然需要在<item>内允许多个ingredientsType元素。如果您可以拥有无​​限制的商品,则可以使用:

<xs:complexType name="ingredientsType">
    <xs:sequence>
        <xs:element name="item" type="itemType" maxOccurs="unbounded" />
    </xs:sequence>    
</xs:complexType>

答案 1 :(得分:0)

尝试将itemType声明为混合(在复杂类型定义上使用mixed='true')。