Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Michael Gerdes am 18.10.06 - 10:15:58

Titel: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 18.10.06 - 10:15:58
Hallo zusammen.

Ich weiß, dieses Thema wurde bereits des öfteren angesprochen. jedoch konnte ich in den verschiedenen Foren keine befriedigende Antwort finden. Vielleicht hat ja einer von euch eine Idee, bzw. einen Lösungsansatz.

Folgende Herausforderung stellt sich mir:

Per E-Mail bekomme ich ein XML-File in eine speziell hierfür eingerichtete Mail-In-Datenbank.
Die dort eingehenden XML-Files möchte ich jetzt gerne per Lotus Script Agent verarbeiten.
Mit verarbeiten meine ich, den Inhalt des XML-Files analysieren, dann einen bestimmten Inhalt (ein Ergebnis einer Geräteprüfung) in ein anderes Dokument (befindet sich in einer anderen DB) schreiben.

Das Auslesen des XML-Files von einem lokalen Dateipdfad (C:\Temp\xxx.XML) ist nicht das Problem.
Jedoch habe Schwierigkeiten mit dem Auslesen des XML-File, solange es sich noch in der E-Mail befindet (will es nicht Lokal abhängen).

Ist es nicht möglich, das XML-File als Objekt (sei es ein EmbeddedObject oder Attachment) abzugreifen und den Inhalt zu analysieren? Mit Java-Script geht das. Da ich aber Java-Script nicht so gut beherrsche, suche ich nach einer Lösung für Lotus Script.

Ich hoffe, einer von euch hat eine Idee. Ich will keine komplette Lösung. Ein Ansatz würde reichen :-)

Und???

Greetz
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: flaite am 18.10.06 - 11:26:17
Die Frage geht doch in Richtung von: (oder)  ???
Kann NotesStream ein NotesEmbeddedObject als Quelle nehmen.
Nach allem, was ich so auf die schnelle gelesen habe, benötigt NotesStream immer eine Datei als Quelle.
In diesem Fall müßtest du die Datei kurz in ein temporäres Verzeichnis kopieren und von dort auslesen (eventuell nicht so schlimm. Mußt eben einen 2. Agenten schreiben, der da manchmal ein bischen aufräumt, d.h. alte Dateien löscht).
Mit einem Java Agenten liesse sich das vermutlich auch irgendwie ohne diesen Zwischenschritt erledigen. Mit LotusScript hängts aber wohl an dieser: Was kann NotesStream als Quelle nehmen? Frage.
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 18.10.06 - 11:48:31
Hallo Axel.

Genau da ist das Problem. Ich will es nicht Lokal wegspeichern, auswerten und dann wieder entfernen. Die Lösung mit dem temporär lokal auf die Platte schieben gefällt mir nicht. Ein Notesstream kann nur einen String (Dateipfad) aufnehmen.
Aber evtl. gibt es eine andere Variante, um ein XML-File direkt als Objekt zu verarbeiten. Java kann das ja auch :-)

Greetz
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: it898ur am 18.10.06 - 12:53:46
Hallo Greetz,

trotz längerer Suche ist es mir bisher nicht gelungen in LS eine eingebettetes Objekt ohne Zwischenspeichern auf der Platte zu verarbeiten. LS sieht dies einfach nicht vor.

Gruß

André
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 18.10.06 - 13:14:20
Hallo.

Siehste, und das genau ist meine Befürchtung. Werde um Java-Script wohl nicht umhin kommen und ein bißchen Eigenstudium betreiben. Die Designerhilfe liefert ja umfangreiche Beispiele.

Danke erstmal :-)

Greetz

Michael
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: flaite am 18.10.06 - 15:56:54
Mit JavaScript kannst du aber sicher auch nicht Attachments und eingebettete Objekte auslesen.
Nur wenn das xml als Text im Inhalt des body Feldes der Mail ist, dann geht das sicher.
Dann täte es aber auch ein Backend-Agent in Java, was ich für die bessere Lösung halte.


Gruß Axel
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 18.10.06 - 16:09:36
Hi.

So sieht das aus. Bin auch schon darauf gestoßen.
Wie könnte so ein Backend-Agent aussehen? Hast Du ein Beispiel parat?
Bei dem ganzen Java-gezuppel wird einem ja ganz anders. Hatte zwar während des Studiums einen Grundkurs, aber der hat wohl seine Wirkung verloren...

Greetz

Michael
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: flaite am 18.10.06 - 17:05:26
schnell geschrieben:

Code
import lotus.domino.*;
import java.io.StringReader;

public class JavaAgent extends AgentBase {

	public void NotesMain() {
		System.out.println("hallo"); 
		try {
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();
		
		String xmlIn = "<?xml version=\"1.0\"?><root><kindOfElement>inhalt</kindOfElement></root>";
		StringReader sr = new StringReader(xmlIn); 
		
		nu.xom.Document doc = null; 
		//nu.xom.Document doc = new nu.xom.Document(sr); 
		nu.xom.Builder parser = new nu.xom.Builder();
		doc = parser.build(sr);
		nu.xom.Attribute bonusAttribute = new nu.xom.Attribute("bonus", "attribute"); 
		nu.xom.Element el = new nu.xom.Element("bonusNode"); 
		el.appendChild("bonus text content"); 		
	el.addAttribute(bonusAttribute); 
		
		nu.xom.Element root = doc.getRootElement(); 
		root.appendChild(el); 
		System.out.println(">" + doc.toString());
		System.out.println(">>>" + doc.toXML());  

		} catch(Exception e) {
			e.printStackTrace();
		}
	}
} 
getestet in Notes 7.
ABER: Du müsstest erst einmal die xom Library von Elliotte Rusty Harold einbinden.
http://www.xom.nu/
Die xom-1.1.jar. (sieht so aus wie in Screenshot. Der Edit Project Button im Java Projekt.
Läuft. Ich habs getestet.

System.out.println wird in Notes-Menü File:Tools:Show in Java Debug Console ausgegeben.

Wie du siehst generiere ich das nu.xom.Document aus einem String.
Später werden dann mit der xom Api ein Element, 1 Attribut und 1 Textnode hinzugefügt.

Jetzt weiss ich auch, dass meine Lieblings-XML-Library XOM von Eliotte Rusty Harold in Notes 7 funktioniert (hat mich immer schon interessiert).  ;D

Gruß Axel

Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: flaite am 18.10.06 - 17:26:38
Ergebnis sieht dann so aus:
Code
hallo
>[nu.xom.Document: root]
>>><?xml version="1.0"?>
<root><kindOfElement>inhalt</kindOfElement><bonusNode bonus="attribute">bonus text content</bonusNode></root>
wie man sieht, sind bonusNode, bonus="attribute" und bonus text content an die konkreten Stellen reingefügt worden.
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 19.10.06 - 08:03:46
Guten Morgen Axel.

Vielen Dank für die schnelle Antwort und einem garantiert funktionierenden Beispiel.
Wie jedoch Eingangs beschrieben würde ich gerne das XML-File direkt aus der E-Mail einlesen ohne vorher das File lokal abzulegen  oder den Code zu extrahieren.
Aus Mangel an Java-Know-How und der schwindenden Zeit zur Realisierung einer Lösung werde ich mich vorerst für die Lotus-Script-Variante, dem temporären, lokalen wegschreiben, dann einlesen und anschließendem Löschen des Files entscheiden.

Nochmals vielen Dank  :)

Und falls doch noch jemand eine gurte Idee hat, so kann er den Thread gerne wieder aufgreifen.

Greetz
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: umi am 19.10.06 - 10:16:29
läuft auf dem Server der HTTP Task? Dann könntest Du den Strom des Attachments über URL einlesen.
mit Java auf die URL http://Server/__replikId.nsf/0/[UNIDderMail]/$file/[NameDesAttachments]?Open
Und dann die Daten so als Strom ins Java bringen.
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 19.10.06 - 10:20:49
Moin :-)

Ja, es handelt sich dabei um einen Domino-Server, auf dem der http-Task läuft.
Das ist eine gute Idee, die ich mir auf jeden Fall mal durch den Kopf gehen lassen werde.

Danke.

Gruß

Michael
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: flaite am 19.10.06 - 10:39:06
Attachments in Notes-Mails kann man vermutlich auch irgendwie mit Activation.jar auslesen.
Ich glaub mein Büro-Nachbar macht sowas in der Art (wenn ich das gestern richtig mitbekommen hab).
Werd den mal fragen, ob man das dafür benutzen kann.
Der ist aber noch nicht da (für den ist Mittag um ca. 16:00 Uhr und um 23:00 Uhr Feierabend).

Gruß Axel



Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 19.10.06 - 11:44:22
Aber Hallo...

Ihr seid so gut zu mir. Wenn Du was rauskriegen könntest, dann wäre das echt super.
Bin für jede Hilfe dankbar.
Ein Weltklasse-Forum hier :-)

Gefällt mir.

greetz

Michael
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: flaite am 19.10.06 - 15:47:05
Vielleicht geht es mit der Klasse MIMEEntity.
Falls ich mich recht erinnere kann man damit irgendwie eine von AUSSEN kommende Mail in mime entities erlegen (z.B. ein Attachment?). Und ein Mime Entity kann man in einen Stream laden.
Das mit Activation.jar ist doch ein bischen anders als ich dachte.
Ich werd auf jeden Fall dran bleiben. Das kann aber dauern, weil ich eben eigentlich z.Zt. anderweitig beschäftigt bin.

Gruß Axel
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 19.10.06 - 15:50:18
Moin Axel.

Ist doch kein Thema. Bis dahin werde ich mir mit dem temporär lokal wegspeichern helfen.
Läuft schon ganz gut... (bis jetzt)
Die elegantere Lösung kann ich dann immer noch in einer höheren Version implementieren.

Greetz

Michael
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 20.02.07 - 17:01:25
Hallo.

Ich möchte nochmal kurz zu diesem Thema Stellung beziehen.
Ich habe mich also jetzt zunächst dazu entschieden, die XML-Files temporär auf dem Server abzulegen, sie dann zu verarbeiten und anschließend wieder zu löschen. Das klappt sehr gut. Solange der dafür erstellte Agent auf einem Windows-Server läuft.
Wir haben unter anderem Linux im Einsatz.
Das merkwürdige ist, wenn der Agent auf einem Linux-Server läuft und die Dateien temporär im Dateisystem von Linux ablegt, dass das jeweilige XML-File nicht eingelesen werden kann.
Das File wird immer mit 0 Bytes gehändelt, dabei steht da eine ganze Menge drin.


Jemand eine Ahnung woran das liegen könnte?

Greetz
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: flaite am 21.02.07 - 18:45:54

Das File wird immer mit 0 Bytes gehändelt, dabei steht da eine ganze Menge drin.[/b]
Vielleicht kannst du mal die entscheidende Stelle im Source Code posten. Das hab ich allerdings noch nie gehört. FileNotFound Exceptions kenne ich aber zu genüge.
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 22.02.07 - 08:16:03
Hi.
Danke für die umgehende Antwort.
Hier der dafür verantwortliche Script-Code:

Zunächst einmal werden XML-Dateien aus einer E-Mail gelöst...

...
'Datei in die vorgegebene Freigabe auf einem Fileserver kopieren und eine laufende Nummer anhängen
filename = Strleft(o.source, ".") & "_" & attachcounter & "." & fileextension 'Dateinamen des Attachments einlesen
Call o.ExtractFile(freigabeFileServer & filename)
...

anschließend wird die Datei wieder in einen Notesstream eingelesen und vom domParser verarbeitet...

...
'erstes XML-File einlesen
xml_in_filename = Dir$( freigabeFileServer, 0)
Do While xml_in_filename <> ""
   If xmlcontinue = True Then
   Else
      Goto Errhandle
   End If   
   xml_in_filepath = freigabeFileServer & xml_in_filename
   Set xml_in=session.CreateStream            
   If Not xml_in.Open( xml_in_filepath) Then
      Print "Cannot open " &  xml_in_filepath,, "XML file error"
      Exit Sub
   End If
   If xml_in.Bytes = 0 Then
      Print  xml_in_filepath & " is empty",, "XML file error"
      Exit Sub
   End If


'XML-File mit dem domParser verarbeiten (Daten in eine Baumstruktur bringen)
   Set domParser=session.CreateDOMParser(xml_in)
   domParser.Process
...

Das eingelesene XML-File enthält 0 Bytes :-( (ermittelt zumindest das Script).
Sieht man sich jedoch die Datei auf dem Server direkt an, so enthält sie 65.832 Bytes (XML-Code).
Kann das an der Codierung liegen (UTF-8)?
Habe auch schon Unicode ausprobiert --> Kein Resultat.

Hast Du eine Idee?

Greetz

Michael

Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: m3 am 22.02.07 - 08:45:27
Die Designer-Hilfe ist Dein Freund! ;)
Zitat
To create a NotesStream object, use the CreateStream method in NotesSession.
When a stream is created, property values are:
Bytes is 0.
...

Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 22.02.07 - 08:58:39
Hallo.

Das stimmt wohl... aber open setzt bytes auf die Anzahl der bytes. So die Designer-Hilfe (siehe unten)

This property is 0 for a new stream.
Open sets this property to:
0 for a new file.
the number of bytes in the file for an existing file.


Und die Datei existiert ja schon auf dem Server.
Außerdem läuft es ja auf einem Windows-Server auch.

Gruß

Michael
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: m3 am 22.02.07 - 09:04:12
Tja, aber ev. stimmt der Dateiname nicht, Du hast keine Rechte oder ähnliches, worauf er ein neues File anlegt, würde ich mal sagen.

Was steht denn in xml_in_filepath drinnen?
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: flaite am 22.02.07 - 09:12:48
Was steht denn in xml_in_filepath
Vielleicht wird die Datei unter Linux nicht gefunden und es wird eine neue Datei angelegt  ???
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 22.02.07 - 09:22:45
Hi.

Zunächst einmal wird die Datei in das entsprechende Verzeichnis kopiert (d.h. vorher lag sie da noch nicht).
Dann wird eben genau diese Datei mit open in einen notesstream eingelesen (dann existiert sie ja schon).
In xml_filepath steht z.B. \local\notesdata\XMLFile\data.xml.
Dort legt er sie ab und liest sie von dort auch wieder ein.
Und dann sind 0 bytes in der Datei (sagt das Script), aber die Datei hat nicht 0 bytes. An der Berechtigung liegt es auch nicht, da die Datei mit allen rechten versehen ist.
Ich werde mir xml_in_filepath nochmal genauer ansehen, aber denke nicht, dass es daran liegt.
irgendwie kann die Datei nicht korrekt gelesen werden, bzw. der Code wird nicht richtig erkannt.

Greetz

Michael
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: flaite am 22.02.07 - 09:31:38
Das Linux Dateisystem kennt normalerweise / und nicht \ als Trennzeichen zwischen Ordnern, Files.
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 22.02.07 - 09:40:08
Hi.

ich werde es mal mit / versuchen...

Danke vorerst :-)

Gruß

michael
Titel: Re: XML-Datei aus Mail einlesen
Beitrag von: Michael Gerdes am 22.02.07 - 10:47:44
Hi.

Danke, Dank, Danke.
Manchmal ist die Lösung so einfach. Da war wohl ein bißchen Unwissenheit im Spiel.
Ich sollte mal eine Linux-Schulung besuchen.

Sei´s drum. es funktioniert mit / statt \.

Vielen Dank.

Mal was anderes: Auch auf dem Entwicklercamp am Montag, Dienstag und/oder Mittwoch?

Greetz

michael