如何验证这个xml输入?

时间:2013-06-22 06:27:10

标签: xml xsd

我是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方案必须遵循以下规则:

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

家庭 - 必须发生一次且最多包含20个符号

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

电子邮件 - 最多只能发生一次,但可能会被忽略;它应该是一个介于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>

2 个答案:

答案 0 :(得分:3)

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

首先,它不是XML。在XML中,属性在start-tag上指定,并且仅在元素的start-tag上指定。所以,只要你有这样的事情,他们就需要改变:

<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:限制的整数。

  • 声明类型的方法是使用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元素。

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

  • 您可以通过说(以及其他内容)来定义family元素的简单类型:

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

    这意味着家庭的价值必须由拉丁字母中的三个字母组成,没有变音符号。如果您希望值“Peter”,“Penz”和“Penzov”合法,则不会这样做;你需要阅读一些关于正则表达式的内容以及理解如何更可靠地编写它们的意思。

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

  • 您正在使用xs:length元素尝试定义family元素的最大长度;你想要xs:maxLength,而不是xs:length。

祝你好运!

答案 1 :(得分: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>