FatalError:具有DTD的有效XML中应具有的属性名称

时间:2019-07-10 23:25:58

标签: xml dtd

我的项目中有2个文件(XML和DTD),我必须对其进行验证。我已经声明了XML文档。我使用XML复制编辑器进行验证,并得到通讯“第9行,第25列,FatalError:预期属性名称”-这意味着元素“ kraj_prod”出了点问题,但我找不到发生了什么。元素“ kraj_prod”没有属性。 XML文档格式正确。 XML复制编辑器中的DTD文档在第一个元素(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 :(得分:0)

错误是由于以下原因引起的:

SELECT
    CASE WHEN Column_1 LIKE '%#%'
         THEN CAST(LEN(Column_1) - LEN(REPLACE(Column_1, '#', '')) AS VARCHAR(100))
         ELSE Column_1 END AS Column_1
FROM yourTable;

wersja NMTOKEN #IMPLIED ""> see here for more details)之后,您不能使用默认的""

它应该像这样:

#IMPLIED

如果类型是CDATA而不是NMTOKEN(wersja NMTOKEN #IMPLIED> NMTOKEN的默认值),则可以将#IMPLIED替换为""

您确定要使用NMTOKEN吗? XML具有该属性的空值。

此外,您对""的声明不正确。您只能以一种方式声明mixed content(包含PCDATA和子元素的元素):

rezyser

最后一件事,因为您的<!ELEMENT rezyser (#PCDATA|imie|nazwisko)*> 属性被声明为id,所以它们不能以数字开头。它们必须是有效的Name。您必须更改start character

答案 1 :(得分:0)

对不起,您的帮助没有答案,但按照提示,我发现“ rezyser”和“ wersja”出错。父级“ rezyser”有两个孩子:imie和nazwisko,不是#PCDATA,所以应该没事

<!ELEMENT rezyser (imie,nazwisko)*>

接下来是“ wersja”,应该像您写的一样,所以我将其更改。 最后是应该是​​#CDATA的“ id”,因为以后我会在XSD文档中对其进行更多声明。

感谢您对XML和DTD的帮助。 在这一步中,我必须关闭线程,因为更改之后,从Notepad ++编程XML Copy Editor和小部件会使我的文档有效(XML和DTD):)