Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> DOMDocument i Exceptions, Dlaczego DOMDocument nie wyrzuca wyjątku
matid
post
Post #1





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
dasko
post
Post #2





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 9.11.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
matid
post
Post #3





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
dasko
post
Post #4





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 9.11.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
NuLL
post
Post #5





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


A ja słyszałem, że tylko konstruktory obiektow dostępnych natywnie w php v5 wywalają wyjątki - reszta już nie...


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
matid
post
Post #6





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
NuLL
post
Post #7





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


I tak to musisz robić...


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
hawk
post
Post #8





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 01:05