Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[XML/SAX] Problem mit Crimson bei externen Entites in DTD

0 views
Skip to first unread message

Lothar Kimmeringer

unread,
Jun 22, 2004, 5:57:10 AM6/22/04
to
Hallo,

ich bin gerade dabei einen Import fuer BMECat-Dateien zu schreiben
und stolpere dabei ueber folgendes Problem bei der Verwendung des
Crimson-Parsers, der beim J2EE mit dabei ist:

Die bmecat-DTDs sind zweigeteilt, die bmecat-base_x_x.dtd enthaelt
alle Basisentities, also z.B. fuer CATALOG_STRUCTURE, ...
Die Datei, die letztendlich die Transaktion, z.B. new_catalog
definiert, bindet nur noch die base-DTD ein und definiert den
grundsaetzlich Aufbau der XML-Datei:

------- schnipp
<!ENTITY % BASE SYSTEM "bmecat_base_1_2.dtd">

%BASE;

<!ELEMENT BMECAT (HEADER,T_NEW_CATALOG)>
<!ATTLIST BMECAT version CDATA #FIXED "1.2"
xmlns CDATA #FIXED
'http://www.bmecat.org/bmecat/1.2/bmecat_new_catalog'>


<!ELEMENT T_NEW_CATALOG
(FEATURE_SYSTEM*,
CLASSIFICATION_SYSTEM*,
CATALOG_GROUP_SYSTEM?,
ARTICLE*,
ARTICLE_TO_CATALOGGROUP_MAP*)>
-------- schnapp

Damit die spaeter eingelesene BMECat-Datei nicht in ein Verzeichnis
gelegt werden muss, in dem sich die DTDs befinden bzw. das ganze
auch mit einer "anonymen" InputSource funktioniert, habe ich einen
EntityResolver geschrieben, der zur BMECat-Datei die entsprechende
bmecat_new_catalog_1_2.dtd und bmecat_base_1_2.dtd liefert.
Beim Aufruf von XMLParser.parse wird dieser auch fuer die erste DTD
aufgerufen und fder Parser reut sich ebenfalls auch ueber die gelieferte
DTD, allerdings erfolgt kein Aufruf des EntityResolvers beim Versuch
die entsprechende base-DTD zu bekommen, sondern bricht das Parsen mit
folgender Exception ab:

10:28:00 CRON:(BMECatImport): Error while trying to parse xml-file '[...]Artikel_BMEcat.xml'
org.xml.sax.SAXParseException: Relative URI "bmecat_base_1_2.dtd";
kann nicht ohne eine Basis-URI aufgelöst werden.
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3339)
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3333)
at org.apache.crimson.parser.Parser2.resolveURI(Parser2.java:2915)
at org.apache.crimson.parser.Parser2.maybeExternalID(Parser2.java:2887)
at org.apache.crimson.parser.Parser2.maybeEntityDecl(Parser2.java:2789)
at org.apache.crimson.parser.Parser2.maybeMarkupDecl(Parser2.java:1357)
at org.apache.crimson.parser.Parser2.externalParameterEntity(Parser2.java:3055)
at org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1314)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:623)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:333)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:345)
at [...]

Habe ich da einen Bug im Crimson gefunden, verwende ich einen veralteten Crimson,
sprich gibt es einen neueren, der das Problem nicht hat? Gibt es eine Moeglichkeit die
URI fuer das Anziehen der DTD von aussen zu setzen (wobei ich bisher immer davon
ausgegangen bin, dass gerade der EntityResolver die meisste Kontrolle hierfuer
bietet) oder gibt es eine Implementierung eines SAX-Parsers, der diesen Effekt
nicht hat?

Ich habe das bis jetzt so geloest, dass ich den Inhalt der base-DTD einfach in
die new_catalog.dtd hineinkopiert habe, finde das aber unschoen.


Gruesse, Lothar
--
Lothar Kimmeringer E-Mail: spam...@kimmeringer.de
PGP-encrypted mails preferred (Key-ID: 0x8BC3CD81)

Always remember: The answer is forty-two, there can only be wrong
questions!

0 new messages