Bei der Verarbeitung von XML -Daten, insbesondere Dokumenten mit Namespaces, ist der XML -Parser von PHP (basierend auf Expat) eine flexible und effiziente Möglichkeit, dies zu tun. Dieser Artikel konzentriert sich auf die Erklärung der Verwendung der Funktion xml_set_end_namespace_decl_handler und kombinieren Sie sie mit vollständigen Beispielen, um zu veranschaulichen, wie die Funktion korrekt verwendet wird und das Ende der Namespace -Deklaration während des Parsenprozesses verarbeitet wird.
PHP provides a series of event-driven XML parsing functions, such as xml_parser_create , xml_parse , xml_set_element_handler , etc. In namespace-related processing, xml_set_start_namespace_decl_handler and xml_set_end_namespace_decl_handler correspond to the namespace declaration start and end respectively.
Obwohl die Verarbeitung eines Namespace häufiger verwendet wird, ist die Endverarbeitung gleichermaßen wichtig, insbesondere wenn das Verschachteln komplex ist oder wenn der Zielfernrohrstapel aufrechterhalten werden muss. Mit xml_set_end_namespace_decl_handler können wir am Ende des Namespace Reinigungsvorgänge ausführen, den Namespace -Stack verwalten oder Protokolle für das Debuggieren.
bool xml_set_end_namespace_decl_handler ( resource $parser , callable $handler )
$ Parser : Eine von XML_PARSER_CREATE erstellte Parser -Ressource.
$ Handler : Die Rückruffunktion in Form von Funktionshandler (Ressource $ Parser, String $ Präfix) wird am Ende der Namespace -Erklärung aufgerufen.
Hier ist ein vollständiges Beispiel mit xml_set_end_namespace_decl_handler :
<?php
$xml = <<<XML
<?xml version="1.0"?>
<root xmlns:h="http://gitbox.net/hello" xmlns:f="http://gitbox.net/foo">
<h:child>Content</h:child>
<f:child>Another</f:child>
</root>
XML;
$parser = xml_parser_create();
// Festlegen der Namespace -Verarbeitung
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
// Der Namespace deklariert den Prozessor
xml_set_start_namespace_decl_handler($parser, function($parser, $prefix, $uri) {
echo "Namespace Start: prefix = {$prefix}, uri = {$uri}\n";
});
// Namespace -Enddeklarationsprozessor
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) {
echo "Namespace End: prefix = {$prefix}\n";
});
// Elementprozessor
xml_set_element_handler($parser,
function($parser, $name, $attrs) {
echo "Start Element: {$name}\n";
},
function($parser, $name) {
echo "End Element: {$name}\n";
}
);
// Parsen ausführen
if (!xml_parse($parser, $xml, true)) {
$error = xml_error_string(xml_get_error_code($parser));
$line = xml_get_current_line_number($parser);
die("XML Error: {$error} at line {$line}\n");
}
xml_parser_free($parser);
Führen Sie das obige Skript aus und geben Sie Folgendes aus:
Namespace Start: prefix = h, uri = http://gitbox.net/hello
Namespace Start: prefix = f, uri = http://gitbox.net/foo
Start Element: root
Start Element: h:child
End Element: h:child
Start Element: f:child
End Element: f:child
End Element: root
Namespace End: prefix = f
Namespace End: prefix = h
Aus der Ausgabe können wir sehen:
Die Reihenfolge der Namespace -Deklarationen stimmt mit ihren Definitionen im Dokument überein.
Nach Abschluss des Element -Parsens erfasst die xml_set_end_namespace_decl_handler das Ende des Namespace korrekt.
Wenn Sie den Namespace Scope -Stapel während der Parsen beibehalten, ist dies ein guter Zeitpunkt, um den Stapel zu veröffentlichen.
Umfangskontrolle : Wenn Sie Namespace -Scopes in XML -Parsen verwenden (z. B. Konfigurieren von Parsers oder Gebäudebaumstrukturen), verwenden Sie unbedingt sowohl Start- als auch Endnamenspace -Deklarationsprozessoren.
Debugging -Tools : Wenn Sie komplexe Situationen wie Namespace -Konflikte debuggen, können Sie die Struktur von XML -Dokumenten besser verstehen.
Namespace -Stack -Design : Sie können das PHP -Array verwenden, um die Stapelstruktur zu simulieren, sie am Ende des Starts auf den Stapel zu setzen, um den aktuellen Namespace -Kontext genauer zu verfolgen.
Obwohl xml_set_end_namespace_decl_handler nicht üblicherweise als Elementprozessoren verwendet wird, kann es eine sehr kritische Hilfsrolle beim Umgang mit komplexen XML bieten, insbesondere beim Mischen mehrerer Namespaces. Wenn Sie seine Verwendung beherrschen, können Sie Ihren XML -Parser stärker und robuster machen. Hoffentlich hilft Ihnen dieser Artikel, diese leistungsstarke Werkzeugfunktion optimal zu nutzen, wenn Sie XML mit PHP analysieren.