Autor Thema: xml Einsatz der EZB suboptimal oder wie xml intelligent verarbeiten  (Gelesen 5258 mal)

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Hi,

es gibt heutzutage in Java verschiedene Libraries, die
- aus dem XML-Schema,
- einer mapping Datei,
- einem Java-Bean
- einem einkommenden xml file

prima mit sehr wenig Code xml Dateien in Java Objekt Strukturen umwandeln können.
(JAXB oder http://xmlbeans.apache.org/ ).
Ich habe leider noch keine praktische Erfahrung damit. Und die Schemastruktur der täglichen Wechselkurse der EZB sieht ein bischen merkwürdig aus, um damit unter dem normalen Zeitdruck jetzt anzufangen.
Code
<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
	<gesmes:subject>Reference rates</gesmes:subject>
	<gesmes:Sender>
		<gesmes:name>European Central Bank</gesmes:name>
	</gesmes:Sender>
	<Cube>
		<Cube time='2006-02-13'>
			<Cube currency='USD' rate='1.1888'/>
			<Cube currency='JPY' rate='140.35'/>
[...stark gekürzt... Axel]
		</Cube>
	</Cube>
</gesmes:Envelope>

Man kann da natürlich immer mit der DOM-Api ran. Aber das ist vermutlich unnötig und es erzeugt ziemlich chaotischen Code:
Der ist übrigens ziemlich "notes-ähnlich", womit ich nicht sagen will, dass Notes chaotisch ist, sondern einfach, dass xml als Datenbank ziemlich notes-ähnlich ist.
(ich zerleg den Code natürlich noch in mehrere private functions).
Code
InputStream is = null;
		try {

			if (get.getStatusCode() != 200) {
				errMsg = "Die URL ist nicht erreichbar:" + urlEcbDaily
						+ ". (http-Statuscode=" + get.getStatusCode();

				throw new WebRetrievalException(errMsg);
			}
			is = get.getResponseBodyAsStream();
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
// erzeuge Dokument 			
Document doc = db.parse(is);

// hole alle Nodes mit dem Namen Cube (wie notesDocumentCollection.getAllDocumentsByKey()
			NodeList nlCube = doc.getElementsByTagName("Cube");
			Date date = null;
			ExchangeRate exchRate = null;
// hier kommen die JavaBeans rein
			Set exchRates = new HashSet();
			for (int i = 0; i < nlCube.getLength(); i++) {
// iteriere über alle Elemente Cube. 
				Element cubeElement = (Element) nlCube.item(i);
				if (cubeElement.getNodeType() == cubeElement.ELEMENT_NODE) {
// hole alle Attribute der node und iteriere über sie. 
// im Element <Cube currency='MYR' rate='4.4265'/> sind currency="MYR" und rate="4.4265" die Attribute. 

					NamedNodeMap cubeAttr = cubeElement.getAttributes();
					for (int j = 0; j < cubeAttr.getLength(); j++) {
						Node attr = cubeAttr.item(j);
						String attrName = attr.getNodeName();
// je nach dem Namen des Attributs mache unterschiedliche Operationen 
// (Beans erzeugen, in einen Set (-> sowas wie ein dynamischer Array) tun, etc. 
						if (attrName.equals("time")) {
							String[] dateParts = attr.getNodeValue().split("-");
							date = new Date();
							date.setYear(Integer.parseInt(dateParts[0]));
							date.setMonth(Integer.parseInt(dateParts[1]) - 1);
							date.setDate(Integer.parseInt(dateParts[2]));
							date.setHours(0);
							date.setMinutes(0);
							date.setSeconds(0);
							System.out.println("date=" + date);
						} else if ((attrName.equals("currency"))
								|| (attrName.equals("rate"))) {

							if (j == 0) {

								exchRate = new ExchangeRate();
								exchRates.add(exchRate);
								exchRate.setDate(date);
							}
							if (attrName.equals("currency")) {
								exchRate.setCurrencyCode(attr.getNodeValue());
							}

							else if (attrName.equals("rate")) {
								exchRate.setRate(Double.parseDouble(attr
										.getNodeValue()));
							}
							System.out.println(" Attribute: (" + j + ")"
									+ attr.getNodeName() + " = "
									+ attr.getNodeValue());
						}
					}
				}
			}
			System.out.println(exchRates);
		}

Zur Not geht also die DOM-APi und sie ist ziemlich notes-ähnlich, wie gesagt.
Weiss jemand irgendwelche bessere Ideen.
Und die Struktur des xml files scheint mir echt nicht so richtig koscher zu sein.
Es gibt 2 Namespaces. Und die Cube Elemente sind so merkwürdig geschachtelt.

Keine direkte Frage, aber kann jemand etwas intelligentes posten?

Gruß Axel
« Letzte Änderung: 13.02.06 - 22:44:12 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
dom4j mit xpath sieht gut aus. Werd das morgen direkt mal machen:
Kapitel using xPath:
Code
XPath xpathSelector = DocumentHelper.createXPath("//Cube/Cube[@time]");
    List results = xpathSelector.selectNodes(doc);
-> alle Notes mit datum

XPath xpathSelector = DocumentHelper.createXPath("//Cube/Cube[@currency]");
    List results = xpathSelector.selectNodes(doc);
Wie mache ich einen xslt-node Selektor, für Elemente, die currency UND rate haben?

Code
//Cube/Cube[@currency and @rate]
kanns jetzt nicht ausprobieren, wäre aber gut.

« Letzte Änderung: 13.02.06 - 22:43:27 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Xml und die Apis dafür bietet eine Menge Möglichkeiten, um mit wenig und übersichtlichen Code auf xml zuzugreifen (lesend oder schreibend). Ich suche hier nach möglichst effizienten Möglichkeiten, um xml auszulesen. Ich mache das erstmal für Java und später für Java_on_Domino_7 und Lotus_Script_on_Domino_7.

Es gibt eine konkrete Aufgabe:
"Die Europäische Zentralbank stellt die täglichen Referenz-Wechselkurse als xml zur Verfügung. Ich möchte die auslesen."
Dafür werde ich verschiedene Möglichkeiten in den genannten Plattformen ausprobieren und zur Verfügung stellen.
Und zwar als vollständigen, lauffähigen Code (nicht so wie oben).
Es wäre schön, wenn jemand mit ausreichend .NET Erfahrung auch ein Beispiel posten könnte.

Es geht nicht um sowas wie: Mit .NET braucht man 4 Zeilen weniger als mit Java und mit Java 2 Zeilen weniger als mit LotusScript. Also ist .NET "besser" als "Java" und "Java" besser als "LotusScript".

Einfach nur den besten Weg auf jeder Plattform herausfinden.

Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Hat übrigens gut funktioniert.
- Für das kleinere File (tägliche Referenzkurse) dom4j mit xpath.
- Für das große File (alle Referenzkurse seit 1999, ca. 2MB) SAX Api. Das gute an Streams ist natürlich, dass man sowas nicht mehr als File abspeichern muß, sondern quasi den Stream direkt in die Sax-Verarbeitung leitet.
 

Einfach-ein-xml ins Web zu stellen ist btw. auch Webservice. Nur eben nicht SOAP. Der Name für einfach ein xml ins web stellen ist POX (plain old xml). 
Hier ein kurzer Vergleich von einem schlauen Mann:
http://pluralsight.com/blogs/dbox/archive/2006/02/17/18869.aspx

Es bleibt aber dabei, dass das Schema der ezb nicht gut ist.

Wenn ich Energie & Zeit habe, versuch ich mal, inwieweit notes7 das packt.

Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline froehlich2000

  • Junior Mitglied
  • **
  • Beiträge: 65
moin,

kann man nun mit notes 7 xml-files parsen??

mfg

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Steht doch da oben. Oder: Was verstehst du eigentlich unter xml-file parsen  ??? (ist ein weites Feld).
Es gibt für LotusScript Sax und Dom Api. Für Java endlich ein JAXP-Spezifikation kompatibles SAX und Dom parsing. Beliebte und weniger low-level Parsing APIs wie jdom oder xom sollten mit den entsprechenden Zusatz-Jars auch funktionieren.
Schmerzlich vermisst werden Java to xml binding Apis. Ich werd mal versuchen, ob JAXB funktioniert.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline froehlich2000

  • Junior Mitglied
  • **
  • Beiträge: 65
also möchte mit n7 ein xml dokument auslesen.
wenn ich schon beim fragen bin: kann ich einem webservice files als parameter übergeben?
mfg

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Zu der ersten Frage, ja kann man. Sogar mit Lotus Script. Siehe session.createDOMParser und alles was daraus folgt.

Zur deiner zweiten Frage. Die hat nichts mit der ursprünglichen Fragestellung zu tun und ist eine ganz andere Baustelle. Würdest du da bitte einen neuen Thread aufmachen.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline froehlich2000

  • Junior Mitglied
  • **
  • Beiträge: 65
mkee...danke...

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz