Skip to content

13. Übung IMPOTS mit XML

In dieser bereits mehrfach behandelten Übung sendet der Server die Ergebnisse in Form eines XML-Streams an den Client zurück.

13.1. Der Server (impots_05B_web)

Der zuvor beschriebene Webdienst zur Steuerberechnung weist eine mehrschichtige Architektur auf:

Im vorherigen Beispiel sendete der Webdienst seinen Clients eine der beiden folgenden Zeilen:

<erreur>message d'erreur</erreur>
<impot>montant de l'impôt</impot>

Dies ist kein wohlgeformtes XML-Dokument, da es kein Root-Tag enthält. Der neue Webdienst wird seine Antwort in folgender Form senden:

<reponse><erreur>message d'erreur</erreur></reponse>

oder

<reponse><impot>montant de l'impôt</impot></reponse>

In beiden Fällen handelt es sich bei der Antwort um ein wohlgeformtes XML-Dokument, das vom Modul [simpleXML] verarbeitet werden kann.

Im dreischichtigen Schema muss nur die Schicht [web] geändert werden. Ihr Code [impots_05B_web] lautet dann wie folgt:


<?php

// Geschäftsschicht
require_once "impots_05_metier.php";

// Fehlerbehandlung
ini_set("display_errors", "off");

// Kopfzeile UTF-8
header("Content-Type: text/plain; charset=utf-8");

// ------------------------------------------------------------------------------
// Webdienst der Steuerbehörde
// Definition der Konstanten
$HOTE = "localhost";
$PORT = 3306;
$BASE = "dbimpots";
$USER = "root";
$PWD = "";
// Die für die Steuerberechnung erforderlichen Daten wurden in die Tabelle mysqL $TABLE
//, die zur Datenbank $BASE gehört. Die Tabelle hat folgende Struktur
// Grenzwerte decimal(10,2), coeffR decimal(6,2), coeffN decimal(10,2)
// die Parameter der steuerpflichtigen Personen (Familienstand, Anzahl der Kinder, Jahresgehalt)
// werden vom Kunden in der Form „params=Familienstand, Anzahl der Kinder, Jahresgehalt“ übermittelt
// Die Ergebnisse (Familienstand, Anzahl der Kinder, Jahresgehalt, zu zahlende Steuer) werden an den Kunden zurückgesendet
// in der Form <Steuer>Steuer</Steuer>
// oder in der Form <Fehler>Fehler</Fehler>, wenn die Parameter ungültig sind
// wird die Schicht [métier] in der Sitzung abgerufen
session_start();
if (!isset($_SESSION['metier'])) {
// Instanziierung der Schicht [dao] und der Schicht [métier]
  try {
    $_SESSION['metier'] = new ImpotsMetier(new ImpotsDaoWithMySQL($HOTE, $PORT, $BASE, $USER, $PWD));
  } catch (ImpotsException $ie) {
    print "<reponse><erreur>Erreur : " . utf8_encode($ie->getMessage() . "</erreur></reponse>");
    exit;
  }
}
$metier = $_SESSION['metier'];

// Die vom Client gesendete Zeile wird abgerufen
$params = utf8_encode(htmlspecialchars(strtolower(trim($_POST['params']))));
//print "empfangene Parameter --> $params\n";
$items = explode(",", $params);
// Es dürfen nur 3 Parameter vorhanden sein
if (count($items) != 3) {
  print "<reponse><erreur>[$params] : nombre de paramètres invalides</erreur></reponse>\n";
  exit;
}//if
// Der erste Parameter (Familienstand) muss „ja“ oder „nein“ sein
$marié = trim($items[0]);
if ($marié != "oui" and $marié != "non") {
  print "<reponse><erreur>[$params] : 1er paramètre invalide</erreur></reponse>\n";
  exit;
}//if
// Der zweite Parameter (Anzahl der Kinder) muss eine ganze Zahl sein
if (!preg_match("/^\s*(\d+)\s*$/", $items[1], $champs)) {
  print "<reponse><erreur>[$params] : 2ième paramètre invalide</erreur></reponse>\n";
  exit;
}//if
$enfants = $champs[1];
// Der dritte Parameter (Gehalt) muss eine ganze Zahl sein
if (!preg_match("/^\s*(\d+)\s*$/", $items[2], $champs)) {
  print "<reponse><erreur>[$params] : 3ième paramètre invalide</erreur></reponse>\n";
  exit;
}//if
$salaire = $champs[1];
// wird die Steuer berechnet
$impôt = $metier->calculerImpot($marié, $enfants, $salaire);
// das Ergebnis wird zurückgegeben
print "<reponse><impot>$impôt</impot></reponse>\n";
// Ende
exit;

Das Format der Antwort des Webdienstes wird in den Zeilen 35, 47, 53, 58, 64 und 71 geändert.

13.2. Der Client (client_impots_05b_web)

Der Client wird angepasst, um dem neuen Format der Antwort Rechnung zu tragen. Zur Verarbeitung der Antwort wird [simpleXML] verwendet:


<?php

// Steuerkunde
// Fehlerbehandlung
ini_set("display_errors", "off");

// ---------------------------------------------------------------------------------
// eine Klasse mit Hilfsfunktionen
class Utilitaires {
...
}

// main -----------------------------------------------------
// Definition der Konstanten
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
// Serverdaten
$HOTE = "localhost";
$PORT = 80;
$urlServeur = "/exemples-web/impots_05B_web.php";

...
exit;

function calculerImpot($HOTE, $PORT, $urlServeur, &$cookie, $params) {
  // verbindet den Client mit ($HOTE,$PORT,$urlServeur)
// sendet das Cookie $cookie, sofern dieses nicht leer ist. $cookie wird per Referenz übergeben
// sendet $params an den Server
// wertet die Ergebniszeile aus
...
  // Liest die Ergebniszeile
  $ligne = fgets($connexion, 1000);
  // Die Verbindung wird geschlossen
  fclose($connexion);
  // Ergebnis berechnen
  $xml = new SimpleXMLElement($ligne);
  $erreur = isset($xml->erreur) ? $xml->erreur : "";
  $impôt = isset($xml->impot) ? $xml->impot : "";
  // Rückgabe
  return array($erreur, $impôt);
}
  • Zeile 32: Die Antwort des Servers wird gelesen. Es handelt sich um ein Dokument XML.
  • Zeile 36: Aus dem empfangenen Dokument XML wird ein Objekt SimpleXML erstellt.
  • Zeile 37: Die eventuelle Fehlermeldung
  • Zeile 38: Der eventuelle Steuerbetrag