In PHP ist XML_Parse eine häufig verwendete Funktion, um XML -Daten zu analysieren. Es analysiert XML -Saiten durch einen Parser und wandelt sie in PHP -Strukturen um. Wenn Entwickler jedoch die Funktion xml_parse verwenden, stoßen sie manchmal auf ein Problem: Entitätzeichen (wie & amp; amp; ) in XML werden nicht richtig analysiert. In diesem Artikel werden die Ursachen und Lösungen für dieses Problem erörtert.
In XML -Dokumenten sind Entitäten alternative Darstellungen bestimmter Zeichen. Zum Beispiel & amp; repräsentiert das & charakter, und & lt; repräsentiert den < Charakter. Diese Einheiten vermeiden Konflikte mit der XML -Syntax wie <und> zum Markieren von Elementen und werden verwendet, um Entitäten zu verbinden.
Im Allgemeinen gibt es Entitätssymbole in zwei Formen:
Vordefinierte Einheiten wie & amp; , & lt; usw.
Benutzerdefinierte Entitäten, die als spezifische Symbole in XML -Dokumenten definiert werden können.
In einigen Fällen kann jedoch ein Unternehmen entkommen, um eine String -ähnliche und amp; amp zu bilden. Was bedeutet, dass es sich tatsächlich um eine Entität von & amp ;
Bei der Verarbeitung von XML -Daten pariert die Funktion XML_Parse in PHP -Entitätszeichen gemäß den Standard -XML -Parsing -Regeln. Unter normalen Umständen konvertiert XML_Parse & amp; zu & lt; < und ordnungsgemäß behandeln andere Einheiten basierend auf der Erklärung und dem Kontext des XML -Dokuments.
Das Problem tritt jedoch normalerweise auf, wenn:
Wenn Entitäten in XML entkommen wurden (zum Beispiel & amp; amp; ), analysiert die Funktion xml_parse sie nicht weiter. Dies liegt daran, dass in XML & amp; amp; wird als normale Zeichenfolge angesehen, keine Entität, die analysiert werden muss. Einfach ausgedrückt, & amp; amp; ist eigentlich eine Fluchtform von & , die nicht automatisch in das ursprüngliche Symbol & amp;.
Wenn benutzerdefinierte Entitäten in XML definiert sind, kann XML_Parse möglicherweise nicht verarbeiten, insbesondere wenn das Dokument DTD (Dokumenttypdefinition) oder XML -Entitäten nicht ordnungsgemäß deklariert.
Um die oben genannten Probleme anzugehen, können Sie die folgenden Lösungen einnehmen:
Wenn Sie auf eine Situation wie diese begegnen, können Sie diese doppelt geflochtenen Einheiten vor dem Parsen manuell ersetzen. Dies kann mit str_replace erreicht werden. Zum Beispiel:
$xmlString = str_replace('&amp;', '&', $xmlString);
Dieser Code ersetzt & amp; amp; mit & amp; Und dann analysiert es. Beachten Sie, dass dieser Ansatz für Situationen geeignet ist, in denen es nur bestimmte Einheiten gibt.
Wenn Sie feststellen, dass die Funktion xml_parse nicht flexibel genug ist, können Sie in Betracht ziehen, SimplexML_Load_String zu verwenden, um XML -Daten zu analysieren. Es ist oft in der Lage, Entitäten besser zu handhaben und eine sauberere Schnittstelle bereitzustellen. Zum Beispiel:
$xmlString = str_replace('&amp;', '&', $xmlString);
$xml = simplexml_load_string($xmlString);
Die Simplexml -Funktion kann normalerweise gemeinsame XML -Entitäten intelligenter verarbeiten.
Wenn Ihre Anwendungsanforderungen komplexer sind und benutzerdefinierte Entitäten oder DTDs umfassen, sollten Sie in Betracht ziehen, andere XML -Parsen -Bibliotheken wie XMLReader zu verwenden, die mehr Steuer- und Konfigurationsoptionen bieten.
Hier ist ein vollständiges Beispiel, das zeigt, wie die Entitäten in XML verarbeitet werden und mit der Funktion XML_PARSE analysiert werden:
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>
<root>
<example>&amp;</example>
<data>Some data</data>
</root>';
// Ersetzen Sie doppelte Entitäten
$xmlString = str_replace('&amp;', '&', $xmlString);
// Erstellen Sie einen Parser
$parser = xml_parser_create();
// Analyse XML Saite
if (!xml_parse($parser, $xmlString, true)) {
echo "Error: " . xml_error_string(xml_get_error_code($parser));
} else {
echo "XML parsed successfully!";
}
// 释放Analyse器
xml_parser_free($parser);
In diesem Beispiel ersetzen wir zunächst den & amp; amp; Entität in der XML -Zeichenfolge und analysieren Sie sie mit XML_Parse . Wenn ein Fehler vorliegt, gibt der Parser eine Fehlermeldung zurück.