【问题标题】:XML file not validating against XSD fileXML 文件未针对 XSD 文件进行验证
【发布时间】:2014-07-24 22:41:02
【问题描述】:

我是 XSD 的新手。我的 XSD 文件当前格式正确且正在验证,并且我的 XML 文件格式正确,但是当我尝试对其进行验证时出现以下错误:“错误位于 8,第 33 列:内容模型不允许字符数据"

它不希望我为该主题添加任何文本(我目前将 PianoML 作为导致错误的第一个主题),但是如何在 XSD 中修复它?我将在底部发布完整文件,但这里是我认为需要修复的代码 sn-p:

<xs:element name="topic">
    <xs:complexType>
      <xs:attribute name="genre" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="ART"/>
            <xs:enumeration value="Music"/>
            <xs:enumeration value="Science"/>
            <xs:enumeration value="Technology"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

我尝试了很多方法,但总是出错。我确信这是一个非常简单的解决方案,但我的新手尝试和谷歌搜索并没有帮助。如何允许该文本?

这是 XML 文件 (presentations.xml):

<?xml version="1.0" encoding="UTF-8"?>
<presentations xmlns="http://www.brett.com/presentations"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.brett.com/presentations presentations.xsd"
>

  <presentation date="2013-07-31" length="PT30M">
    <topic genre="Music">PianoML</topic>
    <presenters>
      <name title="Mr." id="Y258">
        <first>Elvis</first>
        <middle>A</middle>
        <last>Presley </last>
      </name>
      <name title="Miss" id="X365">
        <first>Lady</first>
        <last>Gaga</last>
      </name>
    </presenters>
  </presentation>

    <presentation date="2013-08-05" length="PT35M">
    <topic genre="Science">AlienML</topic>
    <presenters>
         <name title="Mr." id="Y007">
        <first>Will</first>
        <last>Smith</last>
      </name>
      <name title="Mr." id="Y360">
        <first>Tommy</first>
        <first>Lee</first>
        <last>Jones</last>
      </name>
    </presenters>
  </presentation>
</presentations>

这是 XSD 文件 (presentations.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.brett.com/presentations"
targetNamespace="http://www.brett.com/presentations"
elementFormDefault="qualified">

  <xs:element name="presentations">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="presentation"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="presentation">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="topic"/>
        <xs:element ref="presenters"/>
      </xs:sequence>
      <xs:attribute name="date" type="xs:string" use="required"/>
      <xs:attribute name="length" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="topic">
    <xs:complexType>
      <xs:attribute name="genre" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="ART"/>
            <xs:enumeration value="Music"/>
            <xs:enumeration value="Science"/>
            <xs:enumeration value="Technology"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="presenters">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element ref="name"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="name">
    <xs:complexType>
      <xs:sequence>
        <xs:sequence maxOccurs="unbounded">
          <xs:element ref="first"/>
        </xs:sequence>
        <xs:sequence minOccurs="0">
          <xs:element ref="middle"/>
        </xs:sequence>
        <xs:element ref="last"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID" use="required"/>
      <!-- Edit 
      <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:patterrn value=""/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
       End Edit -->
      <xs:attribute name="title" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Mr."/>
            <xs:enumeration value="Mrs."/>
            <xs:enumeration value="Ms."/>
            <xs:enumeration value="Miss"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="first" type="xs:string"/>

  <xs:element name="middle" type="xs:string"/>

  <xs:element name="last" type="xs:string"/>

</xs:schema>

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    您的问题是您已将 Topic 定义为没有扩展名且只有一个属性的复杂类型,因此以下行由于分别具有 PianoML 和 AlienML 的文本内容而无效。

    <topic genre="Music">PianoML</topic>
    

    &

    <topic genre="Science"/>AlienML</topic>
    

    要实现您想要的,您需要将主题定义为

      <xs:element name="topic">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="genre" use="required">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="ART" />
                    <xs:enumeration value="Music" />
                    <xs:enumeration value="Science" />
                    <xs:enumeration value="Technology" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:attribute>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    

    【讨论】:

      【解决方案2】:

      修改topic元素的定义如下:

      <xs:element name="topic">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="genre" use="required">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="ART"/>
                    <xs:enumeration value="Music"/>
                    <xs:enumeration value="Science"/>
                    <xs:enumeration value="Technology"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:attribute>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      

      来自MSDN documentation,约&lt;simpleContent&gt;

      包含对 complexType 元素的扩展或限制 字符数据或 simpleType 元素作为内容并且不包含 元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-05
        • 2013-08-30
        • 1970-01-01
        相关资源
        最近更新 更多