Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: aretni am 08.04.08 - 11:54:11

Titel: Werte aus XML-Datei lesen
Beitrag von: aretni am 08.04.08 - 11:54:11
Hallo,

Ich möchte den aktuellen Währungkurs von http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=USD&ToCurrency=EUR auslesen (in dem Beispiel, aktuellen Dollar Kurs) und Notes zur Verfügung stellen.
Wie mache ich das am besten in Java? Hat jemand vielleicht sowas schon mal programmiert und könnte mir ein Beispiel zukommen lassen?

Vielen Dank im voraus.

Gruß

Aretni
Titel: Re: Werte aus XML-Datei lesen
Beitrag von: flaite am 08.04.08 - 13:25:43
Ich präferiere Jakarta Commons HTTPClient.
Eigentlich besteht die Aufgabe aus 2 Teilen:
1. XML als Stream herunterladen
2. Mit einer XML-Api das XML auslesen.

Hier ist ein code Ausschnitt für das herunterladen mit HTTPClient von jakarta commons:
Code
	/**
	 * Downloads remote resource as Stream.
	 * 
	 * @param url
	 *            url of remote resource.
	 * @return stream of remote resource, not closed here.
	 * @throws SpiHttpConnectionException
	 *             HTTP connection problems.
	 */
	private InputStream connect(final String url)
			throws SpiHttpConnectionException {
		Clogging.debug(getClass().getName() + ".connect(" + url + ")");
		// Create a method instance.
		method = new GetMethod(url);
		method.setFollowRedirects(true);
		// Provide custom retry handler is necessary
		method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
				new DefaultHttpMethodRetryHandler(HTTP_RETRY, false));

		// Execute the method.
		int statusCode;
		try {
			statusCode = client.executeMethod(method);

			if (statusCode != HttpStatus.SC_OK) {
				String msg = StringUtils.replaceOnce(
						Constants.EXCEPTION_MSG_HTTP_STATUS,
						"{param}", "" + statusCode);
				msg = StringUtils.replaceOnce(msg, "{param}", method
						.getStatusLine().toString());
				Clogging.debug(msg);
				throw new SpiHttpConnectionException(msg);

			}
			return method.getResponseBodyAsStream();

		} catch (HttpException e) {

			throw new SpiHttpConnectionException(

			StringUtils.replace(Constants.EXCEPTION_MSG_HTTP,
					"{param}", url));

		} catch (IOException e) {
			throw new SpiHttpConnectionException(StringUtils.replace(
					Constants.EXCEPTION_MSG_IO, "{param}", url), e);

		}

	}

Für Schritt 2 empfehle ich die XPath features von JDom.

Gruß Axel

P.S.: Je konkreter die Fragen, desto zielführender die Antworten.
Titel: Re: Werte aus XML-Datei lesen
Beitrag von: animate am 09.04.08 - 08:39:17
Eine ALternative wäre, dass Du Dir einen WebService Client aus der WSDL des Webservice (http://www.webservicex.net/CurrencyConvertor.asmx?wsdl) erzeugst/erzeugen lässt. Dann kommst Du gar nicht mehr mit XML in Kontakt.
Manche Java IDEs (ich kenne es von Netbeans) können Clients erzeugen, wenn man ihnen die WSDL gibt.
Titel: Re: Werte aus XML-Datei lesen
Beitrag von: flaite am 09.04.08 - 12:20:56
... wobei Client seitige Webservices erst ab Notes 8 unterstützt werden.
Vielleicht sollte ich meine Lösung wirklich mal öffentlich durchprogrammieren.

Die Vorteile sind:
- der generierte Code ist alles andere als einfach zu verstehen.
- mein Vorschläg funktioniert für SOAP und REST Webservices. Eine Erweiterung auf nicht-XML Formate (z.B. JSON, komma-separierte Listen, whatever) ist einfach. Sowohl REST als auch nicht-XML Formate für Webservices sind relativ weit verbreitet. Ich hab letztes Jahr einen Kunden mit dem Business News Dienst Factiva verbunden und die boten manche Webservices NUR als SOAP UND andere NUR als REST an, was ich übrigens merkwürdig fand.

Gruß Axel
Titel: Re: Werte aus XML-Datei lesen
Beitrag von: aretni am 09.04.08 - 12:28:44
Da ich noch ein blutiger Anfänger bin, weiß ich nun nicht mehr weiter. Hab den Tipp mit der WSDL-Datei angenommen und folgendes kam raus:

Mein Agent:
#######
initialize:
Sub Initialize
   Call GetCurrency("USD")
End Sub
#######
GetCurrency:
Sub GetCurrency(waehrung As String)
   sWSDL = "http://www.webservicex.net/CurrencyConvertor.asmx?wsdl"
   Set Client =CreateObject("MSSOAP.SoapClient")
   Call Client.mssoapinit (sWSDL)
   result = Client.****
-------------------
Was trage ich nun hinter "Client." ein um z.B. den aktuellen Kurs vom US Dollar (USD) zu bekommen?
----------------
'Output result to message box   
   Messagebox result, MB_OK, "Get Currency"
End Sub
#########

Kann mir jemand bei dem Problem weiterhelfen?
Titel: Re: Werte aus XML-Datei lesen
Beitrag von: animate am 09.04.08 - 17:30:36
... wobei Client seitige Webservices erst ab Notes 8 unterstützt werden.

Ach so. Ja dann musst Du es zu Fuß programmieren, also wie Axel vorgeschlagen hat.
Ich habe gerade noch diesen Link gefunden, evtl hilft der weiter:

Consuming an external Web service with Domino 6 (http://www.ibm.com/developerworks/webservices/library/ws-soapcon/)
Titel: Re: Werte aus XML-Datei lesen
Beitrag von: flaite am 09.04.08 - 19:15:25
Wenn man sich selber einmal ein solches Framework geschrieben hat, ist es
a) viel transparenter
b) braucht man keine code Generierungsaktionen mehr zu starten
c) funktioniert mit allen Typen von Webservices (also auch REST)
d) einfacher erweiterbar für andere Austauschformate wie JSON
e) kann mit Reverse Proxies umgehen (das, wenn man sich aus der Firma erstmal beim Proxy anmelden muss, wenn man ins Internet will)

Vielleicht stell ich das mal auf unseren Unternehmensblog. Dafür müsste ich aber die jetzigen Lösungen erst einmal konsolidieren und eine Erlaubnis dafür bekommen, das zu posten.

Gruß Axel