Ashura: XML-Dokument-Validierung erzeugt Warnungen

Hallo.

Ich habe mich nun einmal etwas näher mit XML-Dokumenten befasst, die mit einer DTD ausgestattet werden sollen.

Zum Validieren nutze ich die validate()-Methode aus PHPs DOM.

Versuche ich aber nun, mein XML-Dokument gegen meine DTD zu validieren, erhalte ich mehrere kryptische Fehlermeldungen, welche ich mir nicht erklären kann.

Mein XML-Dokument (guestbook.xml):

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE guestbook SYSTEM "../DTD/guestbook.dtd">  
<guestbook>  
  <entry id="e2" visible="true">  
    <datetime>Wed, 01 Mar 2006 12:00:00 +0100</datetime>  
    <host>127.0.0.1</host>  
    <name>/me again</name>  
    <contact>  
      <email>me@example.org</email>  
      <homepage>http://example.org</homepage>  
      <icq>000000000</icq>  
    </contact>  
    <message>Hello again!</message>  
  </entry>  
  <entry id="e1" visible="true">  
    <datetime>Tue, 28 Feb 2006 00:00:00 +0100</datetime>  
    <host>127.0.0.1</host>  
    <name>/me</name>  
    <message>Hello world!</message>  
  </entry>  
</guestbook>

Meine DTD (guestbook.dtd):

  
<!ELEMENT guestbook (entry)+>  
  
<!ELEMENT entry (datetime, host, name, (contact)?, message)>  
<!ATTLIST entry  
  id       ID     #REQUIRED  
  visible  CDATA  (true|false)  "true"  

>  
  
<!ELEMENT datetime (#PCDATA)>  
<!ELEMENT host (#PCDATA)>  
<!ELEMENT name (#PCDATA)>  
<!ELEMENT contact (email, homepage, icq)?>  
<!ELEMENT message (#PCDATA)>  
  
<!ELEMENT email (#PCDATA)>  
<!ELEMENT homepage (#PCDATA)>  
<!ELEMENT icq (#PCDATA)>

Mein PHP-Script (gb.php):

<?php  
  
error_reporting(E_ALL);  
header('content-type: text/html; charset=utf-8');  
  
$str_docpath = 'data/guestbook.xml';  
  
$obj_doc = new DOMDocument();  
$obj_doc->load($str_docpath);  
  
if ($obj_doc->validate()) {  
  echo '"'.$str_docpath .'" is valid!';  
} else {  
  echo '"'.$str_docpath .'" is not valid!';  
}  
  
?>

Es wird immerzu die 6. Zeile in meiner DTD bemängelt:

Warning: DOMDocument::validate() [function.validate]: /…/DTD/guestbook.dtd:6: parser error : AttValue: " or ' expected in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: visible CDATA (true|false) "true" in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: ^ in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: /…/DTD/guestbook.dtd:6: parser error : Attribute default value declaration error in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: visible CDATA (true|false) "true" in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: ^ in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: /…/DTD/guestbook.dtd:6: parser error : Space required after the attribute default value in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: visible CDATA (true|false) "true" in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: ^ in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: /…/DTD/guestbook.dtd:6: parser error : Content error in the external subset in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: visible CDATA (true|false) "true" in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: ^ in /…/gb.php on line 11
Warning: DOMDocument::validate() [function.validate]: Could not load the external subset "../DTD/guestbook.dtd" in /…/gb.php on line 11

Ich verstehe nicht, was die Warnungen zu bedeuten haben. (Besonders geistreich: „^“)

Entferne ich die Definition des visible-Attributes und die entsprechenden Attribute aus dem XML-Dokument, validiert es.

Wo liegt hier also der Fehler? Einen Syntaxfehler kann ich nicht erkennen, ich habe mich an das SELFHTML-Beispiel gehalten.

Einen schönen Mittwoch noch.

Gruß, Ashura

--
sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
mathbr:del.icio.us/ mathbr:w00t/
  1. Hallo,

    <!ATTLIST entry
      id       ID     #REQUIRED
      visible  CDATA  (true|false)  "true"

    CDATA passt nicht zur Aufzaehlung mit festen Werten, entferne es.

    MfG, Thomas

    1. Hallo Thomas.

      CDATA passt nicht zur Aufzaehlung mit festen Werten, entferne es.

      Danke, habe ich nun ebenfalls gemerkt. (Nach mehrmaligem Lesen der Zeile.)

      Aber was hat „^“ zu bedeuten?

      Einen schönen Mittwoch noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      mathbr:del.icio.us/ mathbr:w00t/
  2. Hi,

    man man man, das hat aber gedauert. Also, die Meldung ist kryptisch, stimmt aber im Kern: Entscheide dich bitte, soll visible jetzt CDATA oder true|false sein? Wenn du eines von beiden entfernst müsste es klappen.

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Hallo Rouven.

      man man man, das hat aber gedauert.

      Ehe du den Fehler entdeckt hast?

      Also, die Meldung ist kryptisch, stimmt aber im Kern: Entscheide dich bitte, soll visible jetzt CDATA oder true|false sein? Wenn du eines von beiden entfernst müsste es klappen.

      Ja, tut es auch.

      Einen schönen Mittwoch noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      mathbr:del.icio.us/ mathbr:w00t/
  3. Hallo.

    Wo liegt hier also der Fehler? Einen Syntaxfehler kann ich nicht erkennen, ich habe mich an das SELFHTML-Beispiel gehalten.

    So selten dusselig kann nur ich sein:

    <!ATTLIST entry  
      id        ID     #REQUIRED  
      visible  CDATA  (true|false)  "true"  
    
    >
    
    

    Das ist Blödsinn. Der Inhaltstyp kann nicht zwei mal definiert werden.
    Korrekt also:

    <!ATTLIST entry  
      id        ID            #REQUIRED  
      visible  (true|false)  "true"  
    
    >
    
    

    Damit validiert es.

    Ich danke allen, die sich die Mühe gemacht haben, mein Posting zu lesen.

    Einen schönen Mittwoch noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    mathbr:del.icio.us/ mathbr:w00t/