xml验证错误

时间:2011-11-28 16:18:25

标签: xml recursion xsd xml-validation

我有像这样的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<specification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          
xsi:noNamespaceSchemaLocation="file://Desktop/normal.xsd">
  <university>
    <refstr>bdvl_te_skrm_stc</refstr>
    <ref_complete_customer path="/work/bsr.xml"/>
    <Code>A0f11478</Code>
    <Area>sku</Area>
    <started>1987</started>
    <branch>
      <electronics>
        <students Nr="120" ece="ab">
          <student Name="svr" year="2010" rank="3"/>
          <student Name="bvr" year="2010" rank="1"/>
        </students>
      </electronics>
    </branch>
    <semister>
      <semister num="3"/>
      <extrainfo/>
    </semister>
    <address>
      <extrainfo> some data.
      </extrainfo>
    </address>
  </university>
</specification>

此xml文件的genarated xsd架构是

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"      
  xmlns:wmh="http://www.wmhelp.com/2003/eGenerator" elementFormDefault="qualified">

<xs:element name="specification">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="university"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="university">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="refstr"/>
      <xs:element ref="ref_complete_customer"/>
      <xs:element ref="Code"/>
      <xs:element ref="Area"/>
      <xs:element ref="started"/>
      <xs:element ref="branch"/>
      <xs:element ref="semister"/>
      <xs:element ref="address"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

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

<xs:element name="ref_complete_customer">
  <xs:complexType>
    <xs:attribute name="path" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

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

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

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

<xs:element name="branch">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="electronics"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="electronics">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="students"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="students">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="student" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="Nr" type="xs:string" use="required"/>
    <xs:attribute name="ece" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

<xs:element name="student">
  <xs:complexType>
    <xs:attribute name="Name" type="xs:string" use="required"/>
    <xs:attribute name="year" type="xs:string" use="required"/>
    <xs:attribute name="rank" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

<xs:element name="semister">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="semister"/>
      <xs:element ref="extrainfo"/>
    </xs:sequence>
    <xs:attribute name="num" type="xs:string"/>
  </xs:complexType>
</xs:element>

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

<xs:element name="address">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="extrainfo"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

但是当我验证这种类型的xml时,它会给出这样的错误

“element university {}具有无效的架构定义结构。此错误显示在大学节点的”address element“中。”

我无法纠正此错误,任何人都可以告诉我如何修改此错误。我应该在架构中更改什么。当我验证架构时,它没有错误。

提前致谢。

2 个答案:

答案 0 :(得分:3)

如果我通过使用提供的XML Schema进行验证来运行XML,我认为address元素没有任何问题。但是,在您的架构中,semister元素定义引用自身。由于它没有指定最小出现次数,因此默认值为1.这有效地创建了无限递归的要求。考虑像这样更改XML Schema ......

<xs:element name="semister">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="semister" minOccurs="0"/>
            <xs:element ref="extrainfo" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute name="num" type="xs:string"/>
    </xs:complexType>
</xs:element>

或者看起来像是一个不会强制无限递归的适当约束。

答案 1 :(得分:0)

您的问题在于 semister 元素定义。这是一个不可能的递归定义。

<xs:element name="semister">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="semister"/>
                <xs:element ref="extrainfo"/>
            </xs:sequence>
            <xs:attribute name="num" type="xs:string"/>
        </xs:complexType>
    </xs:element>

下面的XML无效,因为内部semister元素无效,因为它不包含semister和extrainfo元素。

<semister>
            <semister num="3"/>
            <extrainfo/>
</semister>