Wie kann ich saxon ohne Internetverbindung nutzen?
Skeeve
- xml
0 Pete0 Thomas J.S.0 Skeeve0 Thomas J.S.0 Skeeve1 Thomas J.S.0 Skeeve
0 MudGuard0 Skeeve
Moin!
Ich nutze saxon über die Kommandozeile um XML Dateien zu konvertieren. Das geht so lange gut, wie ich eine Internetverbindung habe. Sobald die aber nicht mehr gegeben ist, schlägt das fehl mit der Meldung (Beispiel)
Error
java.net.UnknownHostException: www.apple.com
Transformation failed: Run-time errors were reported
Ich vermute stark, das liegt am DOCTYPE der XML Datei:
<!DOCTYPE plist
PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Wie kann ich saxon dazu bewegen, auch ohne Internetverbindung die Transformationen durchzuführen?
Die Kommandozeile, die ich verwende:
java \ -cp 'saxon8.jar' \ net.sf.saxon.Transform \ -novw \ -o 'myPlaylist.m3u' \ 'myPlaylist.xml' \ 'iTunes playlist to mp3 playlist.xsl' \ extended='No'
Das ganze läuft auf Mac OS X 10.4.9.
-- Skeeve
wie wärs wenn du die dtd lokal speicherst und auf die lokale dtd verweist?
Hallo,
Ich nutze saxon über die Kommandozeile um XML Dateien zu konvertieren. Das geht so lange gut, wie ich eine Internetverbindung habe. Sobald die aber nicht mehr gegeben ist, schlägt das fehl mit der Meldung (Beispiel)
Error
java.net.UnknownHostException: www.apple.com
Transformation failed: Run-time errors were reportedIch vermute stark, das liegt am DOCTYPE der XML Datei:
<!DOCTYPE plist
PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">Wie kann ich saxon dazu bewegen, auch ohne Internetverbindung die Transformationen durchzuführen?
Ja, es liegt an die DOCTYPE-Angabe, aber am Saxon selbst liegt es weniger, der greift ja auch nur auf den default XML-Prozessort zu (unter aktuelle JRE ist das Xerces) und der validiert.
Das Einfachste ist, wenn du die DOCTYPE löscht, oder halt auf eine lokale DTD zugreifst.
Grüße
Thomas
Moin!
Das Einfachste ist, wenn du die DOCTYPE löscht, oder halt auf eine lokale DTD zugreifst.
Löschen wäre ein Workaround und für meinen zugrundeliegenden Anwendungsfall nicht auf Dauer praktikabel. Das Ganze Kommandozeilengedöns wird letzen Endes von einem Applescript aus aufgerufen und hier möchte ich so wenig wie möglich die Eingabedateien vorbehandeln müssen.
Auf eine lokale DTD zuzugreifen klingt auch nicht unbedingt so praktikabel. Die Frage ist auch: Wie bewerkstellige ich das nun wieder. Dazu muß ich dann wohl doch auch wieder auf einen resolver zurückgreifen, oder?
-- Skeeve
Hallo,
Jetzt erinnere ich mich ... ich dachte die Frage nach einem nicht-validierenden Parser konntest du erfolgreich lösen?
http://forum.de.selfhtml.org/archiv/2007/6/t154805/#m1007732 ff.
Auf eine lokale DTD zuzugreifen klingt auch nicht unbedingt so praktikabel. Die Frage ist auch: Wie bewerkstellige ich das nun wieder. Dazu muß ich dann wohl doch auch wieder auf einen resolver zurückgreifen, oder?
Da würde es reichen im XML statt DOCTYPE PUBLIC ein SYSTEM "file:///pfad/zu/datei.dtd" anzugeben.
Eine eigene Resolver-Klasse zu schreiben wäre m.m.N auch überflüssig, da das Problem nicht am Saxon, sondern an dem default XML-Prozessor des JDK/JREs liegt.
Ich weiß nicht, wie automatisiert die Sache bei dir sein muss, aber wenn du es nur von Zeit zu Zeit brauchst, wäre ev. ein Editor, der XML-Kataloge unterstützt, eine Lösung. (gibts wohl auch für Mac).
Eine "heftigere" Lösung wäre natürlich eine kleine Java-Anwendung zu schreiben, in der du den XML-Parser, seine Funktionen und Saxon genau nach deinen Wünschen entsprechend vorkonfigurierst.
Grüße
Thomas
Moin!
Jetzt erinnere ich mich ... ich dachte die Frage nach einem nicht-validierenden Parser konntest du erfolgreich lösen?
Nein. Das war das Problem mit den unbekannten Protokollen. Ein nicht validierender Parser (Aelfred) hat mir hier aber nicht weitergeholfen, da er die DTDs auch dann lädt, wenn er nicht validiert.
Die Protokolle sind kein Problem mehr, da ich einen Resolver einsetze. Der biegt die Protokollangabe dann auf das "file:" Protokoll um und packt noch den passenden Pfad davor.
Prinzipiell ließe sich das auch für diesen Fall einsetzen. Da hakt es dan aber an anderen stellen. Dazu gleich.
Da würde es reichen im XML statt DOCTYPE PUBLIC ein SYSTEM "file:///pfad/zu/datei.dtd" anzugeben.
Das hieße die XML Dateien "anzufassen". Unschön. Begründung... gleich ;-)
Ich weiß nicht, wie automatisiert die Sache bei dir sein muss,
Sehr.
aber wenn du es nur von Zeit zu Zeit brauchst, wäre ev. ein Editor, der XML-Kataloge unterstützt, eine Lösung. (gibts wohl auch für Mac).
jEdit. Bei mir im Dauereinsatz.
Eine "heftigere" Lösung wäre natürlich eine kleine Java-Anwendung zu schreiben, in der du den XML-Parser, seine Funktionen und Saxon genau nach deinen Wünschen entsprechend vorkonfigurierst.
Darauf wird es wohl hinauslaufen :-(
Nun die ausführlichere Erklärung.
Ich verwende öfters verschiedenste XSLTs. Es ist etwas lästig, jEdit jedesmal wieder passend dafür einzustellen, wenn ich mal wieder ein anderes brauche. Ich hätte jetzt in jEdit etwas einbauen können, um mir das zu erleichtern, allerdings hat jEdit's XSLT plugin noch so ein paar Bugs. Ich kann es also allenfalls zum Testen nehmen und nicht um mit den Daten was produktives anzufangen.
Nun ist saxon ja über Kommandozeile aufrufbar und somit muß ich im Normalfall nichts in Java programmieren, um einen XSLT Prozess anzustoßen. Also habe ich angefangen, mir ein kleines Applescript zu schreiben, dem ich diese XSLTs "anvertraue". Außerdem kennt es noch saxon und inzwischen auch den resolver.
Wenn ich nun ein oder mehrere XML Dateien auf dieses Script fallen lasse, präsentiert es mir die Liste seiner XSLTs und ich kann mir eines aussuchen, mit dem nun alle XMLs behandelt werden. Ungemein praktisch.
Durch eine Diskussion auf apfeltalk.de hat sich ergeben, daß mit einem XSLT auch die iTunes Playlisten damit einfach in m3u playlisten verwandelt werden können, oder, mit einem passenden XSLT sich Alben und Interpreten extrahieren lassen. Und so ist dann ein kleiner Beta Test entstanden.
Dabei hat sich bei einem Tester gezeigt, daß es halt nicht funktioniert, wenn keine Internetverbindung da ist.
Als Workaround köscht er sich nun den DOCTYPE heraus. Schöner wäre es natürlich, ich könnte das Problem von vornherein abfangen, indem gar nicht erst versucht wird ins Netz zu gehen.
Darum also die Frage hier.
Jetzt, wo der Hintergrund bekannt ist: Vielleicht hat ja noch jemand eine andere Idee, wie ich das Problem lösen kann.
-- Skeeve
Hallo,
Jetzt erinnere ich mich ... ich dachte die Frage nach einem nicht-validierenden Parser konntest du erfolgreich lösen?
Nein. Das war das Problem mit den unbekannten Protokollen.
Ah, Okay.
Wenn ich nun ein oder mehrere XML Dateien auf dieses Script fallen lasse, präsentiert es mir die Liste seiner XSLTs und ich kann mir eines aussuchen, mit dem nun alle XMLs behandelt werden. Ungemein praktisch.
Hm, das widersprich für mich den Automatismus-Gedanken (zumindest dem "sehr" darin), weil es ja auf ein GUI hindeutet.
Jetzt, wo der Hintergrund bekannt ist: Vielleicht hat ja noch jemand eine andere Idee, wie ich das Problem lösen kann.
Das es sich für mich doch wie eine GUI-Anwendung anhört (wegen der Auswahlliste der XSLTs), drängt sich mir doch der Gedanke auf, eben eine solche GUI zu schreiben. Die eigenetiliche Transformationsfunktionalität kann man dann auslagern, aber vor allem selbst schreiben. Dann könnte man entweder auch mit einem XML-Katalog arbeiten und die DTDs lokal in der Anwendung selbst haben, oder dem Parser explizit sagen, dass er die DTD nicht laden soll.
So ein GUI habe ich auch schon erstellt. Dabei habe ich für die Zusammenstellung der eigentlichen Oberfläche NetBeans genommen und dann meine eigene Funktionen in die Oberfläche "hineinprogrammiert".
Grüße
Thomas
Moin!
So ein GUI habe ich auch schon erstellt. Dabei habe ich für die Zusammenstellung der eigentlichen Oberfläche NetBeans genommen und dann meine eigene Funktionen in die Oberfläche "hineinprogrammiert".
Darauf wird es bei mir dann wohl auch hinauslaufen müssen, wenn ich es denn so weit treiben will :-( Das ganze sollte eigentlich nur ganz simpel in Applescript laufen. AppleScript erlaubt (wenn man nicht gerade XCode verwendet) nur minimalst Dialoge. Da kann ich nichts großartig ausgearbeitetes erstellen.
-- Skeeve
Hi,
Error
java.net.UnknownHostException: www.apple.com
Transformation failed: Run-time errors were reported
<!DOCTYPE plist
PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Leg in Deiner /etc/hosts einen Eintrag
127.0.0.1 www.apple.com
an, konfiguriere dann Deinen lokalen Apache, daß er bei Aufruf der DTD-URL eine lokale Kopie der DTD ausliefert.
cu,
Andreas
Moin!
Leg in Deiner /etc/hosts einen Eintrag
127.0.0.1 www.apple.com
Guter Witz. Ja, ich weiß daß das geht.
an, konfiguriere dann Deinen lokalen Apache, daß er bei Aufruf der DTD-URL eine lokale Kopie der DTD ausliefert.
Siehe weiter unten: Zum einen ist es da einfacher einen resolver zu verwenden, als einen Apache einzurichten, zum anderen kann ich doch nicht vorher wissen, welche DTDs die User so benötigen werden.
-- Skeeve