【问题标题】:How do I declare the root element of an XML document in the XSD schema?如何在 XSD 模式中声明 XML 文档的根元素?
【发布时间】:2020-02-16 23:11:31
【问题描述】:

我正在解决 XML 类的问题,而且我是新手。我的 XSD 文件验证。 XML 文件有以下验证错误:找不到元素“目录”的声明。 XSD 文件名是 catalog.xsd,声明元素“catalog”的 XSD 代码是

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

   <xs:element name="description" type="xs:string" />
   <xs:element name="date" type="xs:string" />
   <xs:attribute name="metadata" type="xs:string" />
   <xs:attribute name="cid" type="cidType" />
   <xs:attribute name="src" type="srcType" />
   <xs:attribute name="donatedBy" type="xs:string" />


   <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:complexType name="catalog">
      <xs:sequence>
         <xs:element name="photo" minOccurs="1" maxOccurs="unbounded" />
      </xs:sequence>
   </xs:complexType>

我已经能够解决所有其他验证错误,因此这两个文件似乎可以正确地相互引用。我错过了一步吗? “目录”元素是否应该以其他方式声明?

谢谢!

我正在添加 XML 代码,我确实认为我可能在那里遗漏了一些东西。 xml 的文件名为 catalog.xml。


<catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          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>

【问题讨论】:

  • 主模式需要一个 INCLUDE 来引用第二个模式。大多数模式都有可选的属性,这些属性有时会在不同的模式中声明。所以你需要在主模式中添加一个 INCLUDE 到另一个模式。它将放在架构的第二行,如下所示:

标签: xml xsd


【解决方案1】:

您的标题问题的答案是,您不能。 XSD 在设计上认为有效元素的每个子树本身都是有效的,并且为了确保该属性成立,它不允许模式说元素 E 是合法的验证根,而其子元素 F、G、而 H 不是。

但是阅读过去的标题,这不是你的问题。您无需声明该目录是文档的根元素,您只需声明它即可。

从您所展示的内容来看,您似乎已经这样做了。因此,错误的两个最可能的原因是:

(a) 您的实例文档实际上植根于不同命名空间中的目录元素

(b) 您实际上并未成功加载此架构文档并将其提供给验证器。你说你已经“解决了其他验证错误”,所以这表明你正在选择架构,所以也许 (a) 更有可能。

要诊断 (a),我们需要查看实例文档。要诊断 (b),我们需要查看您是如何调用模式验证器的。

【讨论】:

  • 谢谢!我确实怀疑,但没有词汇表,我是如何引用命名空间的。我编辑了我的原始帖子以包含该部分代码。 :) 我也在努力帮助班上的另一个学生,当然教别人帮助我更好地理解这个概念。
  • 好的,有了这个新信息,现在很清楚实例文档在没有命名空间中具有catalog,并且架构在没有命名空间中违反了catalog。所以错误只能是这个模式根本没有被拾取;这一定是因为您调用验证的方式。
猜你喜欢
  • 2019-02-25
  • 1970-01-01
  • 2021-12-16
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多