Bei der Analyse von XML -Dokumenten kann die Verwendung von Namespaces Konflikte zwischen Element- und Attributnamen effektiv vermeiden, insbesondere in Szenarien, in denen verschiedene XML -Spezifikationen bei der gemischten Verwendung verwendet werden. Wenn wir den XML -Parser von PHP (basierend auf Expat) verwenden, um XML -Dateien mit mehreren Namespaces zu verarbeiten, ist es besonders wichtig, den Beginn und das Ende eines Namespace vernünftig zu verwalten.
Dieser Artikel konzentriert sich darauf, wie die Funktion xml_set_end_namespace_decl_handler die Situation zur gleichzeitig enden Situation verwaltet, um sicherzustellen, dass die XML -Struktur korrekt analysiert und verfolgt werden kann.
XML_SET_END_NAMEPACE_DECL_HANDLER ist eine von PHP bereitgestellte Funktion, um die vom Parser ausgelöste Prozessor (Rückruffunktion) festzulegen, wenn er auf das Ende der Namespace -Deklaration stößt. Sein Prototyp ist wie folgt:
bool xml_set_end_namespace_decl_handler(XMLParser $parser, callable $handler)
wobei $ parser eine Parser -Ressource ist, die von XML_PARSER_CREATE () erstellt wurde, während $ Handler eine Rückruffunktion ist, die beim Ende eines Namespace -Bereichs bezeichnet wird.
Stellen Sie sich eine XML -Struktur wie folgt vor:
<root xmlns:h="http://gitbox.net/html" xmlns:f="http://gitbox.net/form">
<h:table>
<f:input type="text"/>
</h:table>
</root>
In den obigen XML sind H und F zwei verschiedene Namespaces. Obwohl ihr Geltungsbereich im gesamten <root> -Tag ist, kann in komplexeren Dokumenten eine Struktur verschachtelter Namespaces angezeigt werden und mehrere Namespaces enden gleichzeitig, wenn ein Element geschlossen wird.
Wir möchten am Ende dieser Namespaces einige Operationen durchführen, z. B. das Aufzeichnen, Überprüfen oder Veröffentlichung von Ressourcen.
Hier ist ein vollständiges Beispiel, das zeigt, wie das Ende eines Namespace mit xml_set_end_namespace_decl_handler verarbeitet wird:
<?php
$xml = <<<XML
<root xmlns:h="http://gitbox.net/html" xmlns:f="http://gitbox.net/form">
<h:table>
<f:input type="text"/>
</h:table>
</root>
XML;
// erstellen XML Parser
$parser = xml_parser_create_ns();
// Legen Sie den Namespace -Endprozessor fest
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) {
echo "Ende des Namespace: Präfix = $prefix\n";
});
// Legen Sie den Standardelementprozessor fest
xml_set_element_handler($parser,
function($parser, $name, $attrs) {
echo "Element starten: $name\n";
},
function($parser, $name) {
echo "Endelement: $name\n";
}
);
// Analyse XML Daten
if (!xml_parse($parser, $xml, true)) {
die(sprintf(
"XML Fehler: %s Im %d OK",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)
));
}
// 释放Parser资源
xml_parser_free($parser);
?>
Wenn Sie den oben genannten Code ausführen, sehen Sie eine ähnliche Ausgabe wie folgt:
Element starten: root
Element starten: h:table
Element starten: f:input
Endelement: f:input
Endelement: h:table
Endelement: root
Ende des Namespace: Präfix = h
Ende des Namespace: Präfix = f
Wie Sie sehen können, endet der Namespaces zwar zu Beginn des Dokuments, der Umfang endet tatsächlich, wenn das Element <root> geschlossen ist, und das XML_SET_END_NAMEPACE_DECL_HANDLER erfasst dieses Verhalten erfolgreich.
Der Namespace -Prozessor kann nur dann wirksam werden, wenn Sie xml_parser_create_ns () verwenden, um einen Parser zu erstellen.
Die Rückruffunktion von xml_set_end_namespace_decl_handler empfängt nur zwei Parameter: Parser Resource und Namespace Prefix.
Wenn mehrere Namespaces gleichzeitig enden, wird der Rückruf wiederum für jeden Namespace aufgerufen.
Mit der Funktion xml_set_end_namespace_decl_handler können PHP -Entwickler den Lebenszyklus des Namespace -Lebens genau steuern, insbesondere wenn es sich um komplexe XML -Dokumente handelt. Die Kombination des Prozessors, der den Namespace startet und beendet, können stabile und wartbare XML -Parsen -Logik erstellt werden, um die korrekten Datenverarbeitungsfunktionen in Szenarien wie Webdiensten und Analyse von Konfigurationsdateien zu gewährleisten.