0

我是 XML 新手,需要帮助。我有这个 XML 代码,我必须为其创建一个模式验证器:

<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
    <family pol="m">Peter</family>
    <age>40</age>
    <email>ppenzov@ii.com</email>
</user>
<user>
    <family pol="w">Penz</family>
    <age>65</age>
</user>
<user>
    <family pol="w">Penzov</family>
    <age>19</age>
    <email>pppenzov@ii.com</email>
</user>
</users>

xml 方案必须遵循以下规则:

家庭,年龄和电子邮件必须严格按照顺序

family - 必须出现一次并且最多有 20 个符号

年龄- 必须出现一次并且是 1 到 100 之间的数字

email - 最多只能出现一次,但可以省略;它应该是一个介于 5 到 10 个符号之间的字符串

你能帮我创建一个非常基本的例子吗?

到目前为止,我已经这样做了:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns="http://www.w3schools.com"
           elementFormDefault="qualified">

<xs:element name="user">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="family" type="xs:string">
        <xs:restriction base="xs:string">
          <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
          <xs:enumeration value="family" maxOccurs="1"/>
          <xs:length value="20"/>
        </xs:restriction>
      </xs:element name="family" type="xs:string">
      <xs:element name="age" type="xs:intreger">
        <xs:restriction base="xs:integer">
          <xs:minInclusive value="1"/>
            <xs:maxInclusive value="100"/>
            <xs:enumeration value="age" maxOccurs="1"/>
        </xs:restriction>
      </xs:element name="age" type="xs:intreger">
      <xs:element name="email" type="xs:string">
        <xs:restriction base="xs:string">
          <xs:minLength value="5"/>
          <xs:maxLength value="10"/>
          <xs:enumeration value="email" maxOccurs="1"/>
        </xs:restriction>
      </xs:element name="email" type="xs:string">
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>
4

2 回答 2

3

您已经很接近了,但是当前形式的架构存在许多问题。

首先,它不是 XML。在 XML 中,属性是在元素的开始标记上指定的,并且仅在开始标记上指定。所以无论你有这样的事情,他们都需要改变:

<xs:element name="family" type="xs:string">
  ...
</xs:element name="family" type="xs:string">

正确的形式是

<xs:element name="family" type="xs:string">
  ...
</xs:element>

如果这是复制/粘贴错误,您只需要更加小心。如果这是一个概念问题,您需要阅读 XML 的基础知识。格式良好的规则很简单,但 XML 处理器不会容忍违规行为。(实际上,规范禁止它们容忍违规行为。)

您会发现使用支持 XML 的编辑器很有帮助,它会自动提醒您此类格式正确的问题。(如果你已经在使用一个,你应该更加注意它的遇险信号。)

其次,在清除格式正确问题之后,您的模式文档对于模式文档的 XSD 模式无效。有几个问题。

  • 将元素绑定到特定类型的方法是使用属性type将元素绑定到命名类型)类型声明作为子类型(声明匿名本地类型并将元素绑定到该匿名类型)。不要同时使用两者:您同时告诉模式验证器您要将元素age(例如)绑定到类型 xs:integer 并且要将其绑定到不同的类型,从 xs:integer 通过限制派生.

  • 声明类型的方法是使用 xs:complexType 或 xs:simpleType 元素,而不是 xs:restriction。你想要的结构是这样的:

    <xs:element name="age">
      <xs:simpleType>
        <xs:restriction base="xs:integer">
          ...
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    

    很难记住 XSD 模式文档中的内容并不罕见。许多人发现使用支持 XSD 的编辑器是值得的。

  • xs:enumeration 元素没有名为 maxOccurs 的属性,并且猜测它并不意味着您认为它的含义。您似乎在推测 xs:enumerate 用于指定元素在给定内容模型中可以出现的次数;这是由 xs:element 元素上的 minOccurs 和 maxOccurs 属性完成的。

    xs:enumerate 元素用于枚举一个类型的值空间中的可能值;<xs:enumeration value="family"/>例如,表示被定义类型的合法值之一是字符串“family”。如果它是类型声明中唯一的 xs:enumeration 元素,则意味着“family”是该类型的唯一有效值。

    maxOccurs 属性属于 xs:element 元素;在这种情况下,由于“1”是 maxOccurs 的默认值,因此可以在所有三个 xs:element 元素上将其省略。您可以并且应该删除架构文档中的所有 xs:enumeration 元素。

一旦你清除了这些错误,你的模式文档就是合法的。但这并不意味着你想要它的意思。同样,有几个问题:

  • 您通过说(除其他外)来定义家庭元素的简单类型:

    <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
    

    这意味着family的值必须由拉丁字母表中的三个字母组成,没有变音符号。如果您希望值 "Peter"、"Penz" 和 "Penzov" 是合法的,这是行不通的;您需要阅读一些正则表达式及其含义,以了解如何更可靠地编写它们。

    许多名字都包含带有变音符号的字符(想想波兰逻辑学家 Jan Łukasiewicz,波兰符号的发明者);许多包含非字母字符(空白、连字符、撇号)。因此,将您的“家庭”元素限制为从 A 到 Z 的字母是糟糕的数据建模,即使您只想处理拉丁字母中的名称。

  • 您正在使用 xs:length 元素来尝试定义家庭元素的最大长度;为此,您需要 xs:maxLength,而不是 xs:length。

祝你好运!

于 2013-06-22T15:22:08.627 回答
2

有很多在线模式生成器。我使用它们开始创建一个新的 XML 文档,创建一个关注元素位置的基本模式。这节省了我很多时间。一旦它开始工作,我就开始添加各个字段限制。

最后一个提示。使用使您能够格式化 XML 的编辑器。在最好的情况下,模式很难阅读:-(

模式生成器

这是Freeformatter.com生成的示例

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="users">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="user" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="family">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute type="xs:string" name="pol" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element type="xs:byte" name="age"/>
              <xs:element type="xs:string" name="email" minOccurs="0"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

另一个由xmlgrid生成

 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
         <!-- XML Schema Generated from XML Document on Sat Jun 22 2013 09:54:23 GMT+0100 (IST) -->
         <!-- with XmlGrid.net Free Online Service http://xmlgrid.net -->
         <xs:element name="users">
               <xs:complexType>
                     <xs:sequence>
                           <xs:element name="user" maxOccurs="unbounded">
                                 <xs:complexType>
                                       <xs:sequence>
                                             <xs:element name="family" type="xs:string">
                                                   <xs:complexType>
                                                         <xs:attribute name="pol" type="xs:string"></xs:attribute>
                                                   </xs:complexType>
                                             </xs:element>
                                             <xs:element name="age" type="xs:int"></xs:element>
                                             <xs:element name="email" type="xs:string"></xs:element>
                                       </xs:sequence>
                                 </xs:complexType>
                           </xs:element>
                     </xs:sequence>
               </xs:complexType>
         </xs:element>
   </xs:schema>
于 2013-06-22T09:01:56.300 回答