FatalError: имя атрибута ожидается в допустимом XML с DTD - PullRequest
0 голосов
/ 11 июля 2019

В моем проекте 2 файла (XML и DTD), и я должен его проверить. Я объявил вне документа XML. Я использую XML Copy Editor для проверки и получаю сообщение «FatalError в строке 9, столбец 25: ожидается имя атрибута» - это означает, что что-то не так с элементом «kraj_prod», но я не могу найти, что происходит. Элемент "kraj_prod" не имеет атрибутов. XML-документ правильно сформирован. DTD документ в XML Copy Editor дает мне синтаксическую ошибку в 1-м элементе (kino). Ниже мой код DTD и XML написаны на польском языке.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE kino SYSTEM "filmy.dtd">
<kino>
    <nazwa>Kino Pojutrze</nazwa>
    <film>
        <tytul id="9080" wersja="napisy">Przemytnik</tytul>
        <rezyser><imie>Clint</imie> <nazwisko>Eastwood</nazwisko></rezyser>
        <scenarzysta><imie>Nick</imie> <nazwisko>Schenk</nazwisko></scenarzysta>
        <kraj_prod>USA</kraj_prod>
        <rok_prod>2018</rok_prod>
        <gatunek>dramat</gatunek>
        <gatunek>kryminał</gatunek>
        <czas_trw czas="minuty">116</czas_trw>
        <obsada>
            <aktor><imie>Clint</imie> <nazwisko>Eastwood</nazwisko></aktor>
            <aktor><imie>Bradley</imie> <nazwisko>Cooper</nazwisko></aktor>
            <aktor><imie>Laurence</imie> <nazwisko>Fishburne</nazwisko></aktor>
        </obsada>
    </film>
    <film>
        <tytul id="9293" wersja="">Ja teraz kłamię</tytul>
        <rezyser><imie>Paweł</imie> <nazwisko>Borowski</nazwisko></rezyser>
        <scenarzysta><imie>Paweł</imie> <nazwisko>Borowski</nazwisko></scenarzysta>
        <kraj_prod>Polska</kraj_prod>
        <kraj_prod>Holandia</kraj_prod>
        <rok_prod>2019</rok_prod>
        <gatunek>komedia</gatunek>
        <gatunek>thriller</gatunek>
        <czas_trw czas="minuty"></czas_trw>
        <obsada>
            <aktor><imie>Maja</imie> <nazwisko>Ostaszewska</nazwisko></aktor>
            <aktor><imie>Joanna</imie> <nazwisko>Kulig</nazwisko></aktor>
            <aktor><imie>Rafał</imie> <nazwisko>Maćkowiak</nazwisko></aktor>
            <aktor><imie>Agata</imie> <nazwisko>Buzek</nazwisko></aktor>
        </obsada>
    </film>
    <film>
        <tytul id="9352" wersja="dubbing">Król Lew</tytul>
        <rezyser><imie>Jon</imie> <nazwisko>Favreau</nazwisko></rezyser>
        <scenarzysta><imie>Jeff</imie> <nazwisko>Nathanson</nazwisko></scenarzysta>
        <kraj_prod>USA</kraj_prod>
        <rok_prod>2019</rok_prod>
        <gatunek>animowany</gatunek>
        <gatunek>familijny</gatunek>
        <gatunek>przygodowy</gatunek>
        <czas_trw czas="minuty"></czas_trw>
        <obsada></obsada>
    </film>
    <film>
        <tytul id="6827" wersja="napisy">Wonder Woman</tytul>
        <rezyser><imie>Patty</imie> <nazwisko>Jenkins</nazwisko></rezyser>
        <scenarzysta><imie>Allan</imie> <nazwisko>Heinberg</nazwisko></scenarzysta>
        <scenarzysta><imie>Geoff</imie> <nazwisko>Johns</nazwisko></scenarzysta>
        <kraj_prod>USA</kraj_prod>
        <rok_prod>2017</rok_prod>
        <gatunek>akcja</gatunek>
        <gatunek>sci-fi</gatunek>
        <czas_trw czas="minuty">139</czas_trw>
        <obsada>
            <aktor><imie>Gal</imie> <nazwisko>Gadot</nazwisko></aktor>
            <aktor><imie>Robin</imie> <nazwisko>Wright</nazwisko></aktor>
            <aktor><imie>Chris</imie> <nazwisko>Pine</nazwisko></aktor>
        </obsada>
    </film>
    <film>
        <tytul id="6750" wersja="napisy">Piraci z Karaibów: Zemsta Salazara</tytul>
        <rezyser><imie>Joachim</imie> <nazwisko>Ronning</nazwisko></rezyser>
        <rezyser><imie>Espen</imie> <nazwisko>Sandberg</nazwisko></rezyser>
        <scenarzysta><imie>Jeff</imie> <nazwisko>Nathanson</nazwisko></scenarzysta>
        <kraj_prod>USA</kraj_prod>
        <rok_prod>2017</rok_prod>
        <gatunek>fantasy</gatunek>
        <gatunek>przygodowy</gatunek>
        <czas_trw czas="minuty">135</czas_trw>
        <obsada>
            <aktor><imie>Johnny</imie> <nazwisko>Deep</nazwisko></aktor>
            <aktor><imie>Javier</imie> <nazwisko>Bardem</nazwisko></aktor>
            <aktor><imie>Orlando</imie> <nazwisko>Bloom</nazwisko></aktor>
        </obsada>
    </film>
</kino>

Документ DTD (filmy.dtd):

<!ELEMENT kino (nazwa,film+)>
<!ELEMENT nazwa (#PCDATA)>

<!ELEMENT film (tytul, rezyser+, scenarzysta*, kraj_prod+, rok_prod, gatunek+, czas_trw?, obsada?)>
<!ELEMENT tytul (#PCDATA)>
<!ATTLIST tytul
id ID #REQUIRED
wersja NMTOKEN #IMPLIED "">

<!ELEMENT rezyser (#PCDATA, imie, nazwisko)>
<!ELEMENT scenarzysta (imie, nazwisko)>
<!ELEMENT imie (#PCDATA)>
<!ELEMENT nazwisko (#PCDATA)>

<!ELEMENT kraj_prod (#PCDATA)>
<!ELEMENT rok_prod (#PCDATA)>
<!ELEMENT gatunek (#PCDATA)>
<!ELEMENT czas_trw (#PCDATA)>
<!ATTLIST czas_trw
czas NMTOKEN #FIXED "minuty">

<!ELEMENT obsada (aktor*)>
<!ELEMENT aktor (imie, nazwisko)>

Я хотел получить действительные документы XML и DTD.

Ответы [ 2 ]

0 голосов
/ 28 июля 2019

Извините за отсутствие ответа от вашей помощи, но я обнаружил ошибку в "rezyser" и "wersja", как вы предложили.У родительского "rezyser" есть 2 дочерних элемента: imie и nazwisko, а не #PCDATA, поэтому должно быть хорошо

<!ELEMENT rezyser (imie,nazwisko)*>

Далее следует "wersja", который должен быть таким, как вы написали, поэтому я изменяю его.Последним является «id», который должен быть #CDATA, потому что в будущем я объявлю это больше в документе XSD.

Спасибо за вашу помощь по XML и DTD.На этом шаге я должен закрыть поток, потому что после этого изменения программа XML Copy Editor и виджет из Notepad ++ проверяют мои документы (XML и DTD):)

0 голосов
/ 11 июля 2019

Ошибка из-за этой строки:

wersja NMTOKEN #IMPLIED "">

У вас не может быть значения по умолчанию "" после #IMPLIED ( см. Здесь для получения более подробной информации ).

Это должно выглядеть так:

wersja NMTOKEN #IMPLIED>

Вы можете заменить #IMPLIED на "", если типом был CDATA вместо NMTOKEN ("" является недопустимым значением по умолчанию для NMTOKEN ).

Вы уверены, что действительно хотите использовать NMTOKEN? В XML есть пустое значение для этого атрибута.

Кроме того, ваше объявление для rezyser неверно. Вы можете объявить смешанное содержимое (элемент, содержащий как PCDATA, так и дочерние элементы) только одним способом:

<!ELEMENT rezyser (#PCDATA|imie|nazwisko)*>

И последнее: поскольку ваш атрибут id объявлен как ID, они не могут начинаться с цифры. Они должны быть действительными Имя . Вам придется изменить начальный символ .

...