在XSD中替换

时间:2013-08-23 05:26:26

标签: xml xsd

有以下XML:

<dict >
  <key>key1</key>
  <string>bla-bla</string>

  <key>key2</key>
  <int>123</int>

  <key>key3</key>
  <string>blah-blah</string>

   <!-- key... -->
   <!-- string or int tag -->
   <!-- the pair repeats several times -->
</dict>

我正在尝试为此文件结构创建一个XSD,目前我使用以下代码:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Test"
    targetNamespace="http://tempuri.org/Test.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/Test.xsd"
    xmlns:mstns="http://tempuri.org/Test.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:complexType name ="objectType">
  </xs:complexType>

  <xs:complexType name ="stringType" >
    <xs:complexContent>
      <xs:extension base ="objectType">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name ="intType">
    <xs:complexContent>
      <xs:extension base ="objectType">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name ="dictType">
    <xs:sequence minOccurs ="0" maxOccurs ="unbounded">
      <xs:element type ="xs:string" name ="key"/>
      <xs:element ref ="object" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name ="object" type ="objectType" abstract ="true"/>
  <xs:element name ="string" type ="stringType" substitutionGroup="object" />
  <xs:element name ="int" type ="intType" substitutionGroup="object"/>

  <xs:element name ="dict" type ="dictType" />

</xs:schema>

这个架构让我生成以下xmls

<?xml version="1.0" encoding="utf-8"?>
<dict xmlns="http://tempuri.org/Test.xsd">
  <key>key1</key>
  <string />
  <key>key2</key>
  <string />
  <key>key3</key>
  <int />
</dict>

在这个阶段我找不到使用<int><string>标签提供某些数据的方法。 当我写<int>1</int>之类的东西时。我看到了错误消息。 “元素不能包含文本。内容模型为空”

请问您是否可以按整数填充<int>标记内容,并按字符串标记<string>标记内容?如何?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您是为现有XML还是新XML设计XSD。因为如果你设计一个新的,我会考虑定义一个入口节点。我相信这样可以更容易地定义您的结构,并且生成分类会更好。

<dict>
  <entry>
    <key>key1</key>
    <string>bla-bla</string>
  </entry>
  <entry>
    <key>key2</key>
    <int>123</int>
  </entry>
  <entry>
    <key>key3</key>
    <string>blah-blah</string>
  </entry>
</dict>

编辑:我建议的XSD将是:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://yaugen.com/schemas" xmlns:yaugen="http://yaugen.com/schemas" elementFormDefault="qualified">
    <xs:element name="dict">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="entry" maxOccurs="unbounded" minOccurs="0" type="yaugen:Entry">
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


    <xs:complexType name="Entry">
        <xs:sequence>
            <xs:element type="xs:string" name="key"/>
            <xs:choice>
                <xs:element type="xs:string" name="string" />
                <xs:element type="xs:byte" name="int" />
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

答案 1 :(得分:0)

您已尝试将字符串和int元素定义为具有复杂类型,我无法看到其原因。显而易见的是定义

<xs:element name="string" type="xs:string" substitutionGroup="object"/>
<xs:element name="int" type="xs:int" substitutionGroup="object"/>

但是,为此,必须使用xs:anyType。

类型定义对象