Ошибка проверки XML - PullRequest
       15

Ошибка проверки XML

0 голосов
/ 28 ноября 2011

У меня есть 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>

генерируемая xsd схема для этого xml-файла

<?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, он выдает ошибку, подобную этой

"элемент ВУЗ {} имеет недопустимую структуру для определения схемы. Эта ошибка отображается в" элементе адреса "в узле университета."

Я не могу исправить эту ошибку, может кто-нибудь сказать мне, как изменить эту ошибку. Что я должен изменить в схеме. когда я проверяю схему, в ней нет ошибок.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

Если я выполню ваш XML через проверку с помощью предоставленной XML-схемы, я не вижу никаких проблем с элементом address. Однако в вашей схеме определение элемента semister относится к самому себе. Поскольку он не определяет минимальные вхождения, по умолчанию будет 1. Это эффективно создает бесконечно рекурсивное требование. Подумайте об изменении вашей XML-схемы следующим образом ...

<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>

Или что-то вроде подходящего ограничения, которое не вызывает бесконечной рекурсии.

0 голосов
/ 28 ноября 2011

Ваша проблема с определением элемента 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>
...