2016-08-30 6 views
0

Я построил файл XSD на основе UML и XML код (ссылка и код ниже), но я не могу проверить файл XML.Как правильно создать файл XSD?

<?xml version="1.0" encoding="ISO-8859-15"?> 
<Library 
xsi:noNamespaceSchemaLocation="lib.xsd" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 

<authors> 
    <author id="author1" name="Einstein"/> 
</authors> 
<publications> 
    <Book year="1942" title="7 Kingdoms" author="Einstein"/> 
    <Magazine year="2010" number="203" title="The News"/> 
    <Book year="1956" title="The Fall" author="author1"/> 
</publications> 
</Library> 

Вот XSD файл, который я построил из UML и код XML:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:element name="library" type="Library"> 

<!-- Begin KEY --> 
    <xsd:key name="Author"> 
     <xsd:selector xpath="./authors/Author"/> 
     <xsd:field xpath="@id"/> 
    </xsd:key> 

    <xsd:key name="Magazine"> 
     <xsd:selector xpath="./publications/Magazine"/> 
     <xsd:field xpath="@id"/> 
    </xsd:key> 

    <xsd:key name="Book"> 
     <xsd:selector xpath="./publications/Book"/> 
     <xsd:field xpath="@id"/> 
    </xsd:key> 

    <xsd:key name="Publication"> 
     <xsd:selector xpath="./publications/Magazine | ./publications/Book"/> 
     <xsd:field xpath="@id"/> 
    </xsd:key> 
    <!-- END KEY --> 

    <!-- Begin KEYREF --> 
    <xsd:keyref name="Book.author" refer="Author"> 
     <xsd:selector xpath="./publications/Book/author"/> 
     <xsd:field xpath="@ref"/> 
    </xsd:keyref> 
    <!-- END KEYREF -->  

    </xsd:element> 


    <xsd:complexType name="Author"> 
     <xsd:attribute name="id" type="xsd:string"/> 
     <xsd:attribute name="name" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="Publication"> 
     <xsd:attribute name="title" type="xsd:string"/> 
     <xsd:attribute name="year" type="xsd:integer"/> 
    </xsd:complexType> 

    <xsd:complexType name="Magazine"> 
     <xsd:complexContent> 
      <xsd:extension base="Publication"> 
       <xsd:attribute name="number" type="xsd:integer"/> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:complexType> 

    <xsd:complexType name="Book"> 
     <xsd:complexContent> 
      <xsd:extension base="Publication"/> 
     </xsd:complexContent> 
    </xsd:complexType> 

    <xsd:complexType name="Library"> 
     <xsd:sequence> 
      <xsd:element name="book" type="Book" maxOccurs="unbounded"/> 
      <xsd:element name="magazine" type="Magazine" maxOccurs="unbounded"/> 
      <xsd:element name="author" type="Author" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 

</xsd:schema> 

У меня есть проблема, когда я пытаюсь подтвердите XML-файл, потому что он не находит объявление элемента «Библиотека».

Я не уверен, что KeyRef имени = «Book.author» создан достаточно установленная связь между книгой и автором, и я считаю, что проблема исходит от этого.

Нужно ли добавить код в complexType name = "Book", чтобы создать ссылку и, следовательно, проверить файл XML?

+1

Не достаточно, чтобы комментировать знать, но это с учетом регистра? –

+0

@CecilWard Да, дело имеет значение. Библиотека против библиотеки - это две разные вещи. – Dijkgraaf

+0

С тех пор я много (XSLT) и т. Д., Поэтому очень ржавый. –

ответ

0

Ваша схема не соответствует XML на всех

В настоящее время XML, что ваша схема будет представлять это.

<library> 
    <book title="title_0" year="100" /> 
    <magazine title="title_0" year="100" number="100" /> 
    <author id="id_0" name="name_1" /> 
</library> 

Причины, почему он не будет проверять против XML

  1. Как отмечалось CecilWard, ваша схема определяет библиотеку со строчной, но ваш пример XML имеет как заглавным (библиотека).

  2. Также ваш авторский узел не определяется как повторяющийся элемент в узле авторов.

  3. Вы не определили узел выбора, который может содержать книгу или журнал. Безграничные должны быть на том, что книга или журнал, если они смешиваются, как ваш пример XML.

Я только что сгенерировал схему вашего XML, и это будет проверяться на соответствие этому XML-файлу.

Он не имеет какого-либо из KeyRef-х вы определили, но вы можете добавить их обратно.

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Library"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="authors"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element maxOccurs="unbounded" name="author"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:string" use="required" /> 
        <xs:attribute name="name" type="xs:string" use="required" /> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="publications"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:choice maxOccurs="unbounded"> 
       <xs:element name="Book"> 
        <xs:complexType> 
        <xs:attribute name="year" type="xs:integer" use="required" /> 
        <xs:attribute name="title" type="xs:string" use="required" /> 
        <xs:attribute name="author" type="xs:string" use="required" /> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="Magazine"> 
        <xs:complexType> 
        <xs:attribute name="year" type="xs:integer" use="required" /> 
        <xs:attribute name="number" type="xs:integer" use="required" /> 
        <xs:attribute name="title" type="xs:string" use="required" /> 
        </xs:complexType> 
       </xs:element> 
       </xs:choice> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

В некоторых ситуациях я придерживаюсь идентификаторов всех нижних регистров. –

+0

@CecilWard Это хорошо, но тогда и XML, и XSD должны совпадать. В случае OP они не были, следовательно, ошибка, которую получает OP. – Dijkgraaf

+0

Извините, неясно. Я имел в виду, что я придерживаюсь нижнего регистра, чтобы избежать возможности учета несовместимых с регистром несоответствий. совершенно правильно –

Смежные вопросы