Kannst du ein bischen mehr von deinem Code posten?
Du kannst das Charset sicher an einer Stelle explizit angeben. Dann funktioniert das auch.
Bitte poste mal deinen code, wie du die Streams öffnest von dem Zeug, dass du konvertiert.
Character Encoding kann definitiv nervig sein. Ich habs aber bisher immer in den Griff bekommen.
Das kann z.B. so aussehen (eben in der Notes Hilfe gefunden):
String inPath = "c:\\StreamFiles\\characters.trk";
String charset = "ISO-8859-4";
session.setConvertMIME(false);
Stream inStream = session.createStream();
if (inStream.open(inPath, charset)) {
Falls ISO-8859-15 von Java1.3 tatsächlich nicht unterstützt würde (was ich nicht vermute), kannst du das auch als ISO-8859-1 einlesen, solange du keine $ Symbole verwendest. Ansonsten kann das ein bischen schwieriger werden.
ich musste nur im Stylesheet die encoding=""-Angabe anpassen, dann hat's geklappt.
Aber will euch den Code nicht vorenthalten. Mir persönlich gefällt er nicht besonders, da ich das irgendwie unstrukturiert und nicht nachvollziehbar finde, wenn ich exporter.process() aufrufe, dass dann automatisch das Ergebnis über den XSLTransformer (der eine Zeile drüber steht) ins Datensystem geschrieben wird... aber so ist das wohl mit diesem pipelining
private function run()
Dim session As NotesSession
Dim database As NotesDatabase
Dim dxlExporter As NotesDXLExporter
Dim xslTransformer As NotesXSLTransformer
Dim stream As NotesStream
Dim tmp As NotesStream
Dim coll As NotesDocumentCollection
Dim xsl As NotesStream
Dim html_path As String
Dim dxlToHtmlXsl_path As String
Set session = New NotesSession
Set database = session.CurrentDatabase
html_path = "D:\daten\entwicklung\xml\vertragsverwaltung\vertraege.html"
dxlToHtmlXsl_path = "D:\Daten\Entwicklung\XML\Vertragsverwaltung\dxl-html.xsl"
' Dokumente ermitteln
Set coll = ermittle( database ) ' holt sich momentan einfach die markierten Dokumente
Set tmp = session.CreateStream() ' der dxl-Stream für den XSLTransformer
' DXL-Daten erzeugen
Set dxlExporter = session.CreateDXLExporter( coll, tmp )
Set xsl = session.CreateStream()
Set stream = session.CreateStream()
call stream.Open( html_path )
Call stream.Truncate()
call xsl.Open( dxlToHtmlXsl_path )
Set xslTransformer = session.CreateXSLTransformer( dxlExporter, xsl, stream )
Call dxlExporter.process()
Call stream.Close
end function
Ich hoffe, ich hab beim Aufräumen (unnötige Zeilen, Kommentare) keine wichtigen Sachen mit entfernt ;)
edit: bin im Moment erst mal zufrieden, dass es geht - werde später versuchen, es ein wenig auseinander zu ziehen und besser zu strukturieren. Ich wollte eigentlich für jeden Schritt ne eigene Methode:
call HTML speichern( XML in HTML umwandeln( DXL in XML umwandeln( Dokumente in dxl umwandeln( Dokumente ermitteln ) ) ) )
Aber ich bin da mit den Streams durcheinander gekommen, also hab ich alles in eine Methode gepackt.
Hab es letztlich so belassen und noch ein paar schöne Fehlerbehandlungen drum herumgebaut.
Jetzt habe ich aber 2 Fragen:
Zum Einen: Wie kann ich Antwortdokumente (oder beliebige andere irgendwie mit dem Dokument verknüpfte Dokumente) mit exportieren, sodass sie als Unterelement im xml-Baum auftauchen:
Hier würde dxl 3 Dokumente generieren, ich will aber nur eins
<doc>
<feld1></feld1>
<antworten>
<antwort>
<feld1></feld1>
</antwort>
<antwort>
<feld1></feld1>
<feld2></feld2>
</antwort>
</antworten>
</doc>
Ich dachte mir, dass ich das Hauptdokument in einen Stream exportiere - und die Antwortdokumente per SAX- oder DOM-Parser "dazwischenschiebe" - klingt abenteuerlich und ich hab noch keine Ahnung, ob das überhaupt funktioniert.
Der zweite Punkt: wie stelle ich die Datumswerte schön dar? Laut w3school.com (http://www.w3schools.com/schema/schema_dtypes_date.asp) gibt es hier ja Möglichkeiten, bestimmte Elemente als Datum zu deklarieren - aber was, wenn das vorgegebene Format ganz anders aussieht, als hier beschrieben (oder zumindest nicht yyy-mm-dd lautet)? Wie bekomme ich aus 20070628T000000,00+02 ein 28.06.2007? Mein erster Gedanke war ein Template dafür herzurichten, aber wie dann weiter? Den String zerteilen?
Freue mich bestimmt über jede Antwort :)
Es stellt sich für mich langsam die Frage, warum Du das xml nicht einfach mit einem Agenten rausschreibst.
Dafür müsstest Du einfach nur eine Ansicht durchiterieren und einen String aufbauen und diesen String dann in ein file schreiben.
Dim strRes as String
strRes =|<?xml version="1.0" encoding="ISO-8859-1">| & chr$(13) & chr$(10) & "<docs>" & chr$(13) & chr$(10)
while doc is nothing
strRes=strRes & "<doc>" & chr$(13) & chr$(10)
strRes = strRes & "<feld1>" + doc.getItemValue("feld1")(0) & "</feld1>" & chr$(13) & chr$(10)
...
strRes=strRes & "</doc>" & chr$(13) & chr$(10)
set doc = vw.getNextDocument(doc)
wend
strRes = strRes & "</docs>" & chr$(13) & chr$(10)
Und den String dann einfach in ein File schreiben.
Ich glaub, dass du so die Sache viel einfacher löst als mit xslt. ;)
Xslt wird einfach schnell sehr kompliziert.
Gruß Axel