{"id":518,"date":"2025-02-28T16:45:33","date_gmt":"2025-02-28T16:45:33","guid":{"rendered":"https:\/\/oberle-it-beratung.de\/?p=395"},"modified":"2025-02-28T16:45:33","modified_gmt":"2025-02-28T16:45:33","slug":"wie-man-aus-java-einfach-auf-xml-daten-zugreift","status":"publish","type":"post","link":"https:\/\/www.elrebo.de\/index.php\/2025\/02\/28\/wie-man-aus-java-einfach-auf-xml-daten-zugreift\/","title":{"rendered":"Wie man aus Java einfach auf XML-Daten zugreift"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Die Aufgabe<\/h3>\n\n\n\n<p>In meinem Java-Programm zur <a href=\"https:\/\/elrebo.de\/iban-pruefung\" data-type=\"post\" data-id=\"388\">IBAN-Pr\u00fcfung<\/a> wird bei deutschen IBANs auch gepr\u00fcft, ob die Bankleitzahl (BLZ) g\u00fcltig ist und welche Pr\u00fcfzifferberechnungsmethode (PZBM) f\u00fcr die Kontonummern der Bank verwendet werden soll.<\/p>\n\n\n\n<p>In der ersten Version meines Programms habe ich diese Informationen \u00fcber einen SQL-Zugriff in eine Postgres-Datenbank ermittelt. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-28-um-15.10.09-1024x477.png\" alt=\"\" class=\"wp-image-396\" \/><\/figure>\n\n\n\n<p>Das ist zwar einfach zu programmieren, es ben\u00f6tigt aber auch viel Rechenzeit. Deshalb wollte ich den SQL-Zugriff auf die Datenbank durch den Zugriff auf eine Tabelle ersetzen, die die ben\u00f6tigten Informationen enth\u00e4lt. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Der L\u00f6sungsansatz<\/h3>\n\n\n\n<p>Ich habe die relevanten Daten aus der Datenbank gelesen und in eine XML-Datei tabelle.xml geschrieben:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-28-um-15.13.15.png\" alt=\"\" class=\"wp-image-397\" \/><\/figure>\n\n\n\n<p>F\u00fcr jeden G\u00fcltigkeitszeitraum einer BLZ wird die zugeordnete PZBM angegeben.<\/p>\n\n\n\n<p>Um die passende PZBM zu einer BLZ an einem Stichtag zu finden, kann man auf diese XML-Datei \u00fcber diesen XPath2.0 zugreifen. Man muss dabei die beiden Variablen $blz und $stichtag mit den gew\u00fcnschten Werten belegen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-28-um-15.45.10.png\" alt=\"\" class=\"wp-image-400\" \/><\/figure>\n\n\n\n<p>Mit der Belegung $blz = &#8216;10010123&#8217; und $stichtag = &#8216;2025-02-28&#8242; erh\u00e4lt man das Ergebnis pzbm &#8217;09&#8217;.<\/p>\n\n\n\n<p>Ich verwende hier ein XPath2.0-Feature, die Funktion fn:compare, mit deren Hilfe man vergleichen kann, ob ein String gr\u00f6\u00dfer oder kleiner als ein anderer ist. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Die Umsetzung<\/h3>\n\n\n\n<p>Um XPath2.0 in Java nutzen zu k\u00f6nnen, verwende ich Saxon \u00fcber das s9api. In meinem Java-Programm muss ich jetzt folgende Aufgaben erledigen:<\/p>\n\n\n\n<p>a) bei der Projektinitialisierung:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>die Datei tabelle.xml einlesen und als XmlNode bereitstellen<\/li>\n\n\n\n<li>den XPath einlesen und als XPathExecutable mit den Variablen $blz und $stichtag bereitstellen<\/li>\n<\/ol>\n\n\n\n<p>b) bei der Selektion:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>einen Selektor f\u00fcr das XPathExecutable erzeugen<\/li>\n\n\n\n<li>die Variable $blz im Selektor auf die aktuelle BLZ setzen<\/li>\n\n\n\n<li>die Variable $stichtag im Selektor auf das gew\u00fcnschte Datum setzen<\/li>\n\n\n\n<li>die bereitgestellte XmlNode im Selektor als ContextNode setzen<\/li>\n\n\n\n<li>die PZBM als Ergebnis des Selektors ermitteln<\/li>\n<\/ol>\n\n\n\n<p>Da bei der Selektion ein vorbereitetes XPathExecutable und ein vorbereiteter XmlNode verwendet werden, ist die Ausf\u00fchrung der Selektion sehr schnell.<\/p>\n\n\n\n<p>Die Implementierung habe ich in eine Klasse BlzHelper ausgelagert, die neben den beiden Attributen <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>XmlNode blzTabelle und <\/li>\n\n\n\n<li>XPathExecutable pzbmFuerBlzAmStichtag <\/li>\n<\/ul>\n\n\n\n<p>die beiden Methoden <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>initialisiereTabelle und <\/li>\n\n\n\n<li>getPzbm <\/li>\n<\/ul>\n\n\n\n<p>enth\u00e4lt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-28-um-16.43.39-1024x240.png\" alt=\"\" class=\"wp-image-402\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-28-um-16.30.34-1024x801.png\" alt=\"\" class=\"wp-image-403\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-28-um-16.08.32-1024x805.png\" alt=\"\" class=\"wp-image-401\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Um diesen BlzHelper in einem Java-Programm zu verwenden, muss zuerst einmalig die Methode BlzHelper.initialisiereTabelle aufgerufen werden:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-28-um-16.51.20-1024x228.png\" alt=\"\" class=\"wp-image-404\" \/><\/figure>\n\n\n\n<p>Danach kann die PZBM zu jeder BLZ an jedem Stichtag \u00fcber die Methode BlzHelper.getPzbm ermittelt werden:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/02\/Bildschirmfoto-2025-02-28-um-16.54.59-1024x305.png\" alt=\"\" class=\"wp-image-405\" \/><\/figure>\n\n\n\n<p>Die Highlights dieser L\u00f6sung sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die Navigation im XML-Dokument wird nicht in Java programmiert, sondern als XPath beschrieben.<\/li>\n\n\n\n<li>Die Aufbereitung des XML-Dokuments und des XPaths muss nur einmalig bei der Initialisierung des Programms ausgef\u00fchrt werden.<\/li>\n\n\n\n<li>Da im XPath Variablen verwendet werden, kann der compilierte XPath wiederverwendet werden.<\/li>\n\n\n\n<li>Die Komplexit\u00e4t des Zugriffs auf das XML-Dokument ist in der Helper-Klasse gekapselt.<\/li>\n<\/ul>\n\n\n\n<p>Wenn Sie Interesse an dieser Implementierung haben, dann m\u00fcssen Sie den Code nicht aus den Bildern abschreiben. Melden Sie sich einfach bei mir.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Aufgabe In meinem Java-Programm zur IBAN-Pr\u00fcfung wird bei deutschen IBANs auch gepr\u00fcft, ob die Bankleitzahl (BLZ) g\u00fcltig ist und welche Pr\u00fcfzifferberechnungsmethode (PZBM) f\u00fcr die Kontonummern der Bank verwendet werden soll. In der ersten Version meines Programms habe ich diese Informationen \u00fcber einen SQL-Zugriff in eine Postgres-Datenbank ermittelt. Das ist zwar einfach zu programmieren, es [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":416,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[23,24,42,45,52,54,60,61,62],"class_list":["post-518","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-werkzeuge","tag-bankleitzahlen","tag-blz","tag-java","tag-performance","tag-s9api","tag-saxon","tag-xml","tag-xpath","tag-xpath2-0"],"_links":{"self":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/posts\/518","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/comments?post=518"}],"version-history":[{"count":0,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/posts\/518\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/media\/416"}],"wp:attachment":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/media?parent=518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/categories?post=518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/tags?post=518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}