【问题标题】:Where should xsd:attribute go?xsd:attribute 应该去哪里?
【发布时间】:2016-10-17 03:33:47
【问题描述】:

我被要求建立一个商业数据库,这是我虚构的第一个“公司”。我已经获得了使用 XML 验证的架构,但被要求在 XML 文件中为至少一家公司输入 ORDER/RANKING。但是我尝试这样做,我无法使其验证(即使提供了正确的行)。

这是我的 XML 文件(你可以看到我放了ranking="3",这是我无法写入架构的行)。

   <?xml version="1.0"?>
   <CompanyList> 
  <Company ranking="3">
    <CompanyName>CasesWorldwide</CompanyName>
    <CompanyID>00001</CompanyID>
    <City>Edmonton</City>
    <Province>Alberta</Province>
<ContactName>
    <LastName>Soliman</LastName>
    <FirstName>Ahmed</FirstName>
    <PhoneNumber>646959891</PhoneNumber>
    <ContactCompanyID>00001</ContactCompanyID>
</ContactName>
    <NumberOfEmployees>4000</NumberOfEmployees>
 </Company>
</CompanyList> 

这是架构(我尝试的行在“公司”旁边):

    <?xml version="1.0"?>
 <!-- XSD schema for CS Assignment #3.xml -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="CompanyList">
<xsd:complexType>
<xsd:sequence>

<xsd:element name="Company"> <xsd:attribute name="ranking” type=“xsd:string” use=“optional”/>  
<xsd:complexType> 
<xsd:sequence>    

    <xsd:element name="CompanyName"> 
        <xsd:simpleType>
            <xsd:restriction base="xsd:string">
            <xsd:minLength value="1"/>
            <xsd:pattern value=".*[^\s].*" />
        </xsd:restriction>
    </xsd:simpleType>
    </xsd:element>

    <xsd:element name="CompanyID" type="xsd:integer"/>

    <xsd:element name="City" type="xsd:string" minOccurs="0"/>

    <xsd:element name="Province" type="xsd:string" minOccurs="0"/>

    <xsd:element name="ContactName" minOccurs = "1" maxOccurs="5"> 
    <xsd:complexType>
    <xsd:sequence>             

            <xsd:element name="LastName" type="xsd:string" minOccurs="1"/>

            <xsd:element name="FirstName" type="xsd:string" minOccurs="1"/>

            <xsd:element name="PhoneNumber" type="xsd:integer" minOccurs="1"/> 

            <xsd:element name="ContactCompanyID" type="xsd:integer" minOccurs="1"/>

     </xsd:sequence>
    </xsd:complexType>
    </xsd:element>    

    <xsd:element name="NumberOfEmployees" type="xsd:integer" minOccurs="0"/>    


  </xsd:sequence>
</xsd:complexType>
</xsd:element>

    </xsd:sequence>
</xsd:complexType>
</xsd:element>

</xsd:schema>

【问题讨论】:

  • 您的属性应位于 Company 元素的 下方
  • @Dijkgraaf 当我试图把它放在那里时,我得到的错误是:格式不正确:与元素类型“xsd:attribute”关联的属性“name”的值不能包含'

标签: xml xsd xsd-validation xml-validation


【解决方案1】:

一般情况下xsd:attribute可以出现:

  • 在 XSD 的顶层(xsd:schema 内)。
  • xsd:complexType 内(完全或通过引用)。
  • xs:attributeGroup 内(完整或通过引用)。

你们很亲近;你只需要两个更正:

  1. xsd:attribute 放在xsd:sequence 之后的xsd:complexType 内。
  2. xsd:attribute 中的智能引号更改为常规引号。

总共:

<?xml version="1.0"?>
<!-- XSD schema for CS Assignment #3.xml -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="CompanyList">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Company">
          <xsd:complexType> 
            <xsd:sequence>    
              <xsd:element name="CompanyName"> 
                <xsd:simpleType>
                  <xsd:restriction base="xsd:string">
                    <xsd:minLength value="1"/>
                    <xsd:pattern value=".*[^\s].*" />
                  </xsd:restriction>
                </xsd:simpleType>
              </xsd:element>
              <xsd:element name="CompanyID" type="xsd:integer"/>
              <xsd:element name="City" type="xsd:string" minOccurs="0"/>
              <xsd:element name="Province" type="xsd:string" minOccurs="0"/>
              <xsd:element name="ContactName" minOccurs = "1" maxOccurs="5"> 
                <xsd:complexType>
                  <xsd:sequence>             
                    <xsd:element name="LastName" type="xsd:string" 
                                 minOccurs="1"/>
                    <xsd:element name="FirstName" type="xsd:string"
                                 minOccurs="1"/>
                    <xsd:element name="PhoneNumber" type="xsd:integer" 
                                 minOccurs="1"/> 
                    <xsd:element name="ContactCompanyID" type="xsd:integer" 
                                 minOccurs="1"/>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>    
              <xsd:element name="NumberOfEmployees" type="xsd:integer" 
                           minOccurs="0"/>    
            </xsd:sequence>
            <xsd:attribute name="ranking" type="xsd:string" use="optional"/>  
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

此 XSD 将成功验证您的 XML。

【讨论】:

  • 非常感谢,我知道这条线,但根本不知道该放在哪里。这为我节省了很多时间和痛苦!
  • 阅读一本关于 XSD 的书会为您节省更多时间和痛苦。
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2020-06-08
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
相关资源
最近更新 更多