Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: DOMDocument i Exceptions
Forum PHP.pl > Forum > PHP > Object-oriented programming
matid
Mam taki kod:
  1. <?php
  2.  
  3. try
  4. {
  5. $DOM = new DOMDocument;
  6. $DOM->strictErrorChecking = true;
  7. $DOM->validateOnParse = true;
  8. $DOM->Load( 'article.xml' );
  9. $xsl = new DOMDocument;
  10. $xsl->load( 'article.xsl' );
  11. $xslproc = new XSLTProcessor;
  12. $xslproc->importStyleSheet( $xsl );
  13. $test = $xslproc->transformToDoc( $DOM );
  14. echo $test->saveXML();
  15. }
  16. catch ( Exception $e )
  17. {
  18. echo 'Exception caught: ' . $e->getMessage();
  19. }
  20.  
  21. ?>

No i wszystko jest ok, dopóki nie chce spróbować złapać wyjątku. Zmieniam kolejność elementów w dokumencie XML i wyświetla mi takie coś:
Kod
Warning: DOMDocument::load() [function.load]: Element article content does not follow the DTD, expecting (title , date , author+ , content), got (date title author content ) in /home/matid/www/Current/XML/article.xml, line: 15 in /home/matid/www/Current/XML/XML.test.php on line 8

Logicznym się wydaje, że powinno wyrzucić wyjątek, niestety tak nie jest.
Ustawienie zmiennej strictErrorChecking na true (BTW domyślnie też jest true) powinno zmusić DOM do wyrzucania DOMException.
Wie ktoś dlaczego?
dasko
Czemu oczekujesz od validatora DTD, że wyrzuci wyjątek? Błąd DTD to nie błąd parsera, ani też błąd podczas ładowania - a takie właśnie wywalają DOMException. A Warning jest generowany chyba tylko dlatego, żeby w jakiś sposób było wiadomo, że validacja się nie powiodła(jeśli weryfikujesz na starcie nie masz możliwości zobaczenia co zwróciła weryfikacja). Zauważ, że po tych warningach dokument XML w przeglądarce nadal jest wyświetlany.
matid
Cytat(dasko @ 2005-05-04 19:06:38)
Czemu oczekujesz od validatora DTD, że wyrzuci wyjątek? Błąd DTD to nie błąd parsera, ani też błąd podczas ładowania - a takie właśnie wywalają DOMException. A Warning jest generowany chyba tylko dlatego, żeby w jakiś sposób było wiadomo, że validacja się nie powiodła(jeśli weryfikujesz na starcie nie masz możliwości zobaczenia co zwróciła weryfikacja). Zauważ, że po tych warningach dokument XML w przeglądarce nadal jest wyświetlany.

No dobra, ale trochę nielogiczne wydaje mi się wywalanie błędu DTD przez funkcję DOMDocument::validate();
W manualu pisze, że jeśli walidacja się nie powiedzie, zwraca false, a jeśli się powiedzie, zwraca true. Tylko po co jeszcze ten warning...
Poradziłem sobie po prostu wyciszając tę funkcję, ale IMO jest to trochę pokrętne rozwiązanie.
dasko
Cytat
W manualu pisze, że jeśli walidacja się nie powiedzie, zwraca false, a jeśli się powiedzie, zwraca true. Tylko po co jeszcze ten warning...


Widocznie zarówno weryfikacja przy ładowaniu jak i ta ręcznie wywołana wykorzystują dokładnie te same procedury. Rzeczywiście podczas ręcznego sprawdzania raczej nie powinno wywalać tego Warninga, ale przecież rezultatu validacji przy ładowaniu XMLa nie przechwycisz w żaden sposób. Powinni jakoś zaimplementować warunkową generację tego błedu.
NuLL
A ja słyszałem, że tylko konstruktory obiektow dostępnych natywnie w php v5 wywalają wyjątki - reszta już nie...
matid
Ja sobie chwilowo radzę z tym w ten sposób:
  1. <?php
  2.  
  3. if( @$DOMDocument->validate() === false )
  4. {
  5. throw new Exception( 'Document does not follow the DTD!' );
  6. }
  7.  
  8. ?>

Trochę wyjście na około, ale przynajmniej działa...
NuLL
I tak to musisz robić...
hawk
IMHO ten warning jest potwornym kretynizmem. Jak waliduję plik XML, to raczej po to, żeby sprawdzić, czy jest OK i coś z tym zrobić. Nie po to, żeby wywalić użytkownikowi na ekran obrzydliwy komunikat i prawdopodobnie rozwalić layout swojej strony.

Nie znam innego sposobu niż @ przed wywołaniem funkcji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.