Hallo,
ich habe ein Dokument aus Notes heraus in ein DXL-File exportiert, und dieses dann wieder importiert. Soweit so gut. Der DXL-File hat auch den wunderbaren Header:
<?xml version="1.0" encoding="utf-8"?>
Nur leider werden jetzt im NotesClient (7er) nach dem Import die Sonderzeichen (ä,ü,ö,ß,...) nicht mehr korrekt dargestellt. Ich habe am Importer keine Option gefunden, mit der ich Ihm mitteilen kann, welche Codierung er verwenden soll, und im Client habe ich den Zeichensatz auch auf UTF-8 umgestellt (allerdings erst nach dem Export), trotzdem bekomme ich die Sonderzeichen nicht korrekt angezeigt. Was mache ich falsch?
Gruß,
Sebastian
Import:
Stream stream = session.createStream();
dxlImporter = session.createDxlImporter();
boolean t1 = stream.open(filename);
if (t1) {
dxlImporter.setReplaceDbProperties(false);
dxlImporter.setReplicaRequiredForReplaceOrUpdate(false);
dxlImporter.setAclImportOption(DxlImporter.DXLIMPORTOPTION_IGNORE);
dxlImporter.setDesignImportOption(DxlImporter.DXLIMPORTOPTION_CREATE);
dxlImporter.importDxl(stream, db);
stream.close();
}
export:
filename = "somestring";
DxlExporter dxlExporter = null;
try {
dxlExporter = session.createDxlExporter();
dxlExporter.setDoctypeSYSTEM(pfad_zur_dtd);
String fileLocation = path + File.separator + filename;
String dxl = dxlExporter.exportDxl(doc);
File dxldatei = new File(fileLocation + ".dxl");
FileOutputStream fos = new FileOutputStream(dxldatei);
fos.write(dxl.getBytes("UTF-8"));
fos.close();
checkDXL(fileLocation + ".dxl");
}
("doc" ist hier vom Typ lotus.domino.Document und wird der Methode direkt übergeben.)
manipulation
public boolean checkDXL(String filename){
boolean retValue = false;
try{
Document doc = parse(filename);
Element root = doc.getRootElement();
getChildren(root);
OutputFormat format = new OutputFormat("", true, "utf-8");
FileOutputStream fos = new FileOutputStream(filename);
XMLWriter writer = new XMLWriter(fos, format);
writer.write(doc);
...
}
}
("parse" ist hier nur das einlesen der DXL-Datei mit einem SAX-Parser)
das getchildren ist ziemlich lang, verändert aber eigentlich auch nur Werte innerhalb des bereits geparsten "xml", sollte also nix mehr mit der Codierung am Hut haben.
Danke schonmal :)
Hi,
deine Extraktion in einen String und dann in Bytes und das dann in einen FileOutputStream ist umständlich.
Ich verstehe zur Zeit allerdings auch nicht, warum das nicht funktioniert.
Versuch mal den Export wie in der Hilfe:
import lotus.domino.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// (Your code goes here)
// Get current database
Database db = agentContext.getCurrentDatabase();
// Export to file
String filename = "c:\\dxl\\exporteddb.dxl";
Stream stream = session.createStream();
if (stream.open(filename)) {
stream.truncate(); // Any existing file is erased
DxlExporter exporter = session.createDxlExporter();
System.out.println("Exported " +
stream.writeText(exporter.exportDxl(db)) +
" bytes to " + filename);
}
else
System.out.println("Cannot open " + filename);
} catch(Exception e) {
e.printStackTrace();
}
}
}
Hi,
das mit den Bytes mache ich, damit ich in den FileOutputStream schon UTF-8 Daten schreiben kann. Exportiere ich wie von Dir (der Hilfe) vorgeschlagen, bekomme ich beim späteren parsen der dxl-Datei mit dem dom-parser eine
org.dom4j.DocumentException:
Invalid byte 2 of 3-byte UTF-8 sequence.
Exception.
da der Parser wohl über Zeichen wie äüöß stolpert!
(Sorry für meine späte Antwort, andere Projekte fordern derzeit mehr Zeit ein)
edit: ich vermute ja schon fast, dass der eigentliche Fehler beim wegschreiben der Datei nach der Manipulation liegt.
folgender "Umweg" hat leider auch nicht weitergeholfen:
OutputFormat format = new OutputFormat("", true, "UTF-8");
FileOutputStream fos = new FileOutputStream(filename);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
XMLWriter writer = new XMLWriter(osw, format);
writer.write(doc);
noch jemand eine Idee?