Philipp Hasenfratz: supi!

Beitrag lesen

Halihallo Andreas

war gut. Im Grunde habe ich Dich auch vorher schon so verstanden. Ich habe gerade was ausprobiert und es funktioniert auch!

Nein! - Du warst schneller :-)
Ich hab's soeben auch erfolgreich umsetzen können. Zu meiner
Verteidigung: Es war purer selbstnutzen, ich wollte auch mal ein
XML-Dokument mit PHP Parsen ;-)

Ich habe aber die "NormalizedCharacterData()"-Funktion in den anderen Handlern immer aufgerufen und das untersuchen des Strings mache ich dann _in_ "NormalizedCharacterData()".

Genau! - Gut.

Eins wundert mich aber noch: warum übergibst Du an "NormalizedCharacterData()" nochmal den Parser?

Vielleicht brauchst du Parser-Informationen. Linie oder byteOffset...
Zudem ist es Expat-CharacterData-Callback "kompatibel".

Ich hatte noch ein paar Fehler in meinem Beispiel: In den anderen
Callbacks muss natürlich auch ein 'global $normalizedString' stehen.

Hm. Falls sich sonst grad noch wer für den Source interessiert:
   (normalerweise gibts das von mir nicht!)

<source>
<?

$xml_source = '<?xml version="1.0" encoding="UTF-8"?>
<sect1>
   <title>
      Absatztitel
   </title>

<para>
      Absatztext
      neue Zeile
   </para>
</sect1>
';

$normalizedString = '';

$parser = xml_parser_create();

xml_set_character_data_handler( $parser, "CharacterData" );
xml_set_element_handler($parser, "StartElement", "EndElement");
xml_set_processing_instruction_handler($parser, "PIData");

if (!xml_parse($parser,$xml_source,1)) {
    die( 'Fehler im XML-Parsing: ' .
    xml_error_string(xml_get_error_code($parser)) .
    ' in Linie: ' .
    xml_get_current_line_number($parser));
}

function CharacterData($parser,$data) {
    global $normalizedString;
    // Normalisierungsprozess ist hier:
    $normalizedString .= $data;
    // Keine weitere Verarbeitung! - Der normalisierte String wird
    // NormalizedCharacterData() verarbeitet!
}

function StartElement($parser,$name,$attributes) {
    // Wurde vor dem Start dieses Elementes irgendwelche CDATA's
    // empfangen? - So können diese (zusammengehängt in $normStr)
    // dem NormalizedCharacterData()-Callback übergeben werden und
    // dort so verarbeitet werden, als wäre es der normale
    // Expat-Callback für 'Char'.
    global $normalizedString;
    if (strlen($normalizedString)) {
        NormalizedCharacterData($parser,$normalizedString);
        $normalizedString = '';
    }
    // hier jetzt das "normale Verarbeiten von StartElement".
    echo("found element $name\n");
}

function EndElement($parser,$name) {
    global $normalizedString;
    if (strlen($normalizedString)) {
        NormalizedCharacterData($parser,$normalizedString);
        $normalizedString = '';
    }
    // hier jetzt das "normale Verarbeiten von EndElement".
    echo("element end for $name\n");
}

function PIData($parser,$target,$data) {
    global $normalizedString;
    if (strlen($normalizedString)) {
        NormalizedCharacterData($parser,$normalizedString);
        $normalizedString = '';
    }
    // hier jetzt das "normale Verarbeiten von PIData".
    echo("ProcessingInstruction for $target with $data.\n");
}

function NormalizedCharacterData($parser,$data) {
    // so, das ist jetzt unser "erweiterter CharacterData-Callback"
    // hier kommen aber nur die wirklich normalisierten Strings hin!

// hier einfach das hinschreiben, was du sonst in den Expat-
    // 'Char'-Handler geschrieben hättest.

// Hm. Dem Design zu Liebe einfach mal nur Strings ausgeben, wie auch
    // wirklich was sinnvolles enthalten...

if (preg_match( '/[1]*$/', $data )) { return; }

echo("Endlich habe ich die TextNodes normalisiert: '$data'\n");
}

?>
</source>

Viele Grüsse

Philipp

--
The only program that runs perfectly every time, is a virus.

  1. \n ↩︎