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.
\n ↩︎