0

有以下 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>用字符串标记内容?如何?

先感谢您!

4

2 回答 2

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>
于 2013-08-23T06:00:15.053 回答
0

您尝试将 string 和 int 元素定义为具有复杂类型,我看不出这是什么原因。显而易见的事情是定义

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

但是,要使其正常工作,必须使用类型 xs:anyType 定义对象。

于 2013-08-23T09:03:34.207 回答