首页 > 解决方案 > 如何在 XML Schema 中声明一个引用元素的必需属性?

问题描述

因此,我一直在处理此 XML 和 XSD 文件并尝试对其进行验证,但在我的 XSD 文件中我的 cid 属性出现错误,并且我的 XML 中的另一个错误可能与关闭目录标记上的 XSD 文件有关。

XML 状态中的错误“cvc-complex-type.2.4.b:元素'目录'的内容不完整。'{“”:照片,“”:名称}'之一是预期的。

 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!--
   New Perspectives on XML
   Tutorial 3
   Case Problem 1

   Catalog of photos from the Our Lady of Bergen Historical Society
   Author: Joshua Carpentier
   Date:   2/20/19

   Filename:         catalog.xml
   Supporting Files: catalog.xsd
-->

<catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="catalog.xsd"
>

<!-- did you want us to included this attribute not sure xsi:noNamespaceSchemaLocation="catalog.xsd"-->
   <photo cid="c1748" donatedBy="John Borelli">
      <name metadata="tunis cooper property museum">Tunis R. Cooper property</name>
      <description>
      <![CDATA[ 
         This photo was taken by John Borelli's great-grandfather. It is believed to have been taken around 1830.
         David Demarest originally purchased the site of the chair factory in 1663. This site was under the ownership 
         of the Demarest family until 1758.  The property is listed in the National and New Jersey Registers of Historic Places.
      ]]>
      </description>
      <date>circa 1830</date>
      <images>
         <img src="1748a.jpg" />
         <img src="1748b.jpg" />
      </images>
   </photo>

   <photo cid="c1749" donatedBy="John Borelli">
      <name metadata="tunis cooper property museum">Tunis R. Cooper property</name>
      <description>
      <![CDATA[ 
         A more recent picture of the property taken by the Borelli family.  The property is listed in the 
         National and New Jersey Registers of Historic Places.
      ]]>
      </description>
      <date>circa 1950</date>
      <images>
         <img src="1749a.jpg" />
      </images>
   </photo>

   <photo cid="c1411" donatedBy="Saint Johns Catholic Church">
      <name metadata="saint johns catholic church">Saint Johns Church</name>
      <description>
      <![CDATA[ 
         A more recent picture of the property taken by the Borelli family.  The property is listed in the 
         National and New Jersey Registers of Historic Places.
      ]]>
      </description>      
      <date>1921</date>
   </photo>


   <photo cid="c2003" donatedBy="Linda Choo">
      <name metadata="bergenfield elementary school">Bergenfield School</name>
      <description>
      <![CDATA[ 
         The No. 5 Public School, a.k.a. Bergenfield School
      ]]>
      </description>
      <date>circa 1920</date>
      <images>
         <img src="2003a.jpg" />
         <img src="2003b.jpg" />
      </images>
   </photo>

   <photo cid="c2078" donatedBy="Maria Giodelli">
      <name metadata="coopers pond water">Coopers Pond</name>
      <description>
      <![CDATA[ 
         A favorite spot where we used to go hang out as kids.  The picture shows my brothers Robert and Michael.
      ]]>
      </description>
      <date>May 4, 1941</date>
      <images>
         <img src="2078a.jpg" />
      </images>
   </photo>

   <photo cid="c2079" donatedBy="Linda Uffington">
      <name metadata="watch timekeeping pocket railway">Pocket Watch</name>
      <description>
      <![CDATA[ 
         A more recent picture of the property taken by the Borelli family.  The property is listed in the 
         National and New Jersey Registers of Historic Places.
      ]]>
      </description>
      <date>circa 1870</date>
      <images>
         <img src="2079a.jpg" />
         <img src="2079b.jpg" />
      </images>
   </photo>

   <photo cid="c3233">
      <name metadata="hotel">Bergenfield Hotel</name>
      <description>
      <![CDATA[ 
         The Knollfield Hotel was known as the Bergenfield Hotel.  The property is listed in the 
         National and New Jersey Registers of Historic Places.
      ]]>
      </description>
      <date>circa 1920</date>
   </photo>

   <photo cid="c3433">
      <name metadata="sweeney coal fuel">Sweeney Coal</name>
      <description>
      <![CDATA[ 
         Sweeney Fuel Company located near New Bridge Road and railroad tracks.
      ]]>
      </description>
      <date>1920</date>
      <images>
         <img src="3433a.jpg" />
         <img src="3433b.jpg" />
         <img src="3433c.jpg" />
      </images>
   </photo>

</catalog>

XSD 中的错误指出“s4s-elt-must-match.1:'catalog' 的内容必须匹配(注释?,(simpleType | complexType)?,(唯一 | key | keyref)*))。问题是发现开始于:属性。”

  1. 到目前为止,我根据 ID 数据类型为 cidType 创建了一个 simpleType,并且仅限于正则表达式模式 c\d{4},并基于字符串数据类型创建了另一个 simpleType srcType,并且仅限于正则表达式模式 [ a-zA-Z0-9]+.jpg

这些是具体的问题 6b 是我不确定我的代码在其他步骤方面是否还有其他问题的问题。

  1. 声明包含以下嵌套子元素序列的照片元素——名称、描述、日期和图像。为嵌套元素设置以下属性:

一个。所有子元素都应包含字符串数据。name 元素也应该支持 metadata 属性。

湾。cid 属性是必需的。donatedBy 属性是可选的。

  1. 声明 img 元素。它没有内容并包含一个必需的属性 src。
  2. 声明以下属性和元素:

一个。属性元数据必须具有字符串数据类型。

湾。属性 cid 必须具有 cidType 数据类型。

C。属性 src 必须具有 srcType 数据类型。

d。属性donatedBy 必须具有字符串数据类型。

e. 元素描述必须具有字符串数据类型。

F。元素日期必须具有字符串数据类型。

 <?xml version="1.0" encoding="UTF-8" ?>
<!--
   New Perspectives on XML
   Tutorial 3
   Case Problem 1

   Catalog of photos from the Our Lady of Bergen Historical Society
   Author: Joshua Carpentier
   Date:   2/20/19

   Filename:         catalog.xsd
   Supporting Files: catalog.xml
-->      
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="cidType"> 
<xs:restriction base ="xs:ID"> 
<xs:pattern value= "c\d{4}"/> 
</xs:restriction> 
</xs:simpleType> 

<xs:simpleType name="srcType"> 
<xs:restriction base ="xs:string"> 
<xs:pattern value= "[a-zA-Z0-9]+.jpg"/> 
</xs:restriction> 
</xs:simpleType> 

<xs:element name="catalog">



<xs:complexType> 
 <xs:sequence>
 <xs:element name="photo" minOccurs="1" maxOccurs="unbounded"/>
 <xs:element name="name" type="xs:string"/>
 <xs:element name="description" type="xs:string"/>
 <xs:element name="date" type="xs:string"/>
 <xs:element name="images" type="xs:string"/>
 </xs:sequence>
</xs:complexType> 


<xs:attribute name="cid" ref="cidType" use="required"/>
<xs:attribute name="donatedBy" use="optional" type="string"/>
<xs:attribute name="metadata"/>



<xs:element name="img" use="required" src=".jpg"/>
<xs:element name="metadata" type="xs:string"/>
<xs:element name="cid"  type="cidType"/>
<xs:element name="src"  type="srcType"/>
 </xs:element>

</xs:schema>

标签: xmlxsd

解决方案


推荐阅读