Ich analysiere (viele) XML-Dateien, die Entity-Referenzen enthalten, die ich vorher nicht kenne (kann das nicht ändern).
Zum Beispiel:
%Vor%wenn ich versuche, dies mit dem folgenden Code zu analysieren:
%Vor%Ich bekomme die folgende Ausnahme:
%Vor%Aber was ich erreichen möchte, ist, dass der Parser jede Entität, die nicht deklariert ist (unbekannt für den Parser), durch einen leeren String ersetzt. Oder noch besser, gibt es eine Möglichkeit, eine Karte an den Parser zu übergeben:
%Vor%damit ich folgendes tun könnte:
%Vor%Wenn ich den Text aus dem Dokument unter Verwendung dieses Beispielcodes erhalten würde, sollte ich erhalten:
%Vor%Irgendwelche Vorschläge? Natürlich würde ich schon gerne die leeren Entitäten durch leere Strings ersetzen.
Danke,
Die StAX-API unterstützt dies. Sehen Sie sich XMLInputFactory an, es hat eine Laufzeiteigenschaft , die vorschreibt, ob interne Entitäten erweitert werden oder nicht an Ort und Stelle gelassen. Wenn der Wert auf false
gesetzt ist, enthält der StAX-Ereignisstrom Instanzen von EntityReference
, um die nicht expandierten Entitäten darzustellen.
Wenn Sie immer noch ein DOM als Endergebnis haben möchten, können Sie es wie folgt verketten:
%Vor% In diesem Fall enthält das resultierende DOM Knoten von org.w3c.dom.EntityReference
, die mit den Textknoten gemischt sind. Sie können diese dann so verarbeiten, wie Sie es für richtig halten.
Da Ihre XML-Eingabe scheinbar als String verfügbar ist, könnten Sie keine einfache Vorverarbeitung mit einem regulären Ausdrucksersatz durchführen?
%Vor% Es ist ziemlich hacky, und Sie möchten vielleicht etwas mehr Aufwand investieren, um sicherzustellen, dass die Regexps nur dort übereinstimmen, wo sie wirklich sollten (denke <entity name="&don't-match-me;"/>
), aber zumindest ist es etwas ...
Natürlich gibt es effizientere Möglichkeiten, denselben Effekt zu erzielen, als replaceAll()
oft aufzurufen.
Sie können die Entitäten am Anfang der Datei hinzufügen. Schauen Sie hier nach, um weitere Informationen zu erhalten.
Sie können sich auch diesen Thread ansehen, in dem jemand eine EntityResolver-Schnittstelle implementiert zu haben scheint ( Sie könnten auch EntityResolver2 implementieren!), wo Sie die Entitäten im laufenden Betrieb bearbeiten können (zB mit Ihrer vorgeschlagenen Map).
ACHTUNG: Es gibt einen Fehler! in jdk6, aber Sie könnten es mit jdk5 versuchen