XML-Anbindung



Das Aufrufschema beispielsweise des Anzeigeprogramms der Gruppen des Vereins geht aus folgender Abbildung hervor:



Es stehen derzeit folgende XML-Programme zur Verfügung:

Die Texte in den XML-Dateien sind alle UTF-8 kodiert.

Die folgenden Codingbeispiele sollen als Hilfe zur Implementierung eigener Funktionen dienen. Sie wurden vor Veröffentlichung gestestet, wir garantieren jedoch nicht, dass sie zu jeder Zeit in jeder Umgebung lauffähig sind. Hierfür sind eigene Tests notwendig.

Ein vollständiges Beispiel-Coding kann hier als ZIP-Datei heruntergeladen werden.

Verschlüsselung der Parameter (bei Mitgliederdatenabruf notwendig)



Die folgende Klasse ist hilfreich, um die Parameter zu verschlüsseln. Aus den Coding gehen auch die Parameter der Verschlüsselung hervor.


class Cipher {
var $key,$sslkey,$td,$iv,$ivlen;
var $method = "AES-256-CBC";

function init($textkey) {
$this->ivlen = openssl_cipher_iv_length($this->method);
$str = openssl_random_pseudo_bytes($this->ivlen);
$this->iv = substr(hash('sha256',$str),0,$this->ivlen);
$this->sslkey = hash('sha256',$textkey);
}

function encrypt($input,$nobase64) {
$encrypted = openssl_encrypt($input,$this->method,$this->sslkey,0,$this->iv);
$encrypted = $this->iv.$encrypted;
$erg = empty($nobase64) ? base64_encode($encrypted) : $encrypted;
return $erg;
}

function decrypt($input,$binarymode,$nobase64) {
$input = empty($nobase64) ? base64_decode($input) : $input;
$iv = substr($input,0,$this->ivlen);
$input = substr($input,$this->ivlen);
$decrypted = openssl_decrypt($input,$this->method,$this->sslkey,0,$iv);
if (!$binarymode) $decrypted = rtrim($decrypted, "\0");
return $decrypted;
}
}


Beispiel-Coding


Die folgenden Funktionen dienen zur Konvertierung der eingelesenen XML-Daten in ein Array.


function http_get($url) {
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

function xml2subtab($xml) {
while($xml->read()) {
switch($xml->nodeType) {
case XMLReader::ELEMENT:
if ($icnt[$xml->localName] > 0) {
if ($icnt[$xml->localName] == 1) {
$oldval = $node[$xml->localName];
unset ($node[$xml->localName]);
$node[$xml->localName][] = $oldval;
}
$node[$xml->localName][] = xml2subtab($xml);
$icnt[$xml->localName]++;
}
else {
$node[$xml->localName] = xml2subtab($xml);
$icnt[$xml->localName] = 1;
}
break;
case XMLReader::TEXT:
$node = $xml->value;
break;
case XMLReader::END_ELEMENT:
return $node;
}
}
}

function xml2table($url) {
$ret = http_get($url);
$xml = new XMLReader();
if ($xml->xml($ret) === false) return false;
do {
$xml->read();
} while ($xml->nodeType != XMLReader::ELEMENT);
if ($xml->nodeType == XMLReader::ELEMENT) $tab[$xml->localName] = xml2subtab($xml);
return $tab;
}

Hier wird auch gleich die Klasse Cipher zur Verschlüsselung der Parameter verwendet und die nachfolgenden Funktionen zur Umformung der XML-Daten in ein Array aufgerufen.

...
$call_id = "86b79997406aac46dc743c9a474ab5a0"; // Daten des Demovereins
$vcryptkey = "mf8d3hd76cf4NJ8uggf5fHZGF73"; // Geheimer Schlüssel (s. allg. Parameter)
$cipher = new Cipher(); // Initialisierung der Verschlüsselung
$cipher->init($vcryptkey);

$paraar['call_id'] = $call_id; // Zusammenstellung der Parameter
$paraar['suchbeg'] = "diet*";
$paraar['suchalterv'] = 23;
$paras = http_build_query($paraar); // Parameterstring zusammensetzen
$cparas = $cipher->encrypt($paras); // verschlüsseln
$cpe = rawurlencode($cparas);
$url = "https://www.mgvo.de/prog/pub_mit_xml.php?call_id=$call_id&paras=$cpe";
$tab = xml2table($url); // Programm aufrufen und XML in Tabelle umformen
...