XML -Namespaces werden verwendet, um die Namenskonflikte zwischen Elementen und Attributen in XML zu beheben. In der Regel werden Namespaces von URIs identifiziert, während Präfixe die Verweise auf Namespaces vereinfachen. Das folgende XML -Dokument enthält beispielsweise zwei Namespaces:
<book xmlns:ns1="http://www.example.com/ns1"
xmlns:ns2="http://www.example.com/ns2">
<ns1:title>PHP Programming</ns1:title>
<ns2:author>John Doe</ns2:author>
</book>
In diesem Beispiel sind NS1 und NS2 Präfixe für zwei Namespaces, die auf http://www.example.com/ns1 und http://www.example.com/ns2 zugeordnet sind.
Wenn wir die XPath -Abfrage in PHP verwenden, können Namespaces einige Probleme verursachen, insbesondere wenn Elemente mit unterschiedlichen Namespaces abfragen. Um diese Namespaces korrekt zu analysieren, stellt PHP die RegisterXPathNameSpace -Methode bereit, mit der wir ein Präfix einem URI zuordnen können.
Angenommen, wir möchten den Titel- und Autorelemente aus dem obigen XML -Dokument in PHP extrahieren. Wir können den folgenden Code verwenden:
$xml = new DOMDocument();
$xml->loadXML($xmlString);
$xpath = new DOMXPath($xml);
// Registrieren Sie einen Namespace
$xpath->registerNamespace('ns1', 'http://www.example.com/ns1');
$xpath->registerNamespace('ns2', 'http://www.example.com/ns2');
// Abfrage
$title = $xpath->evaluate('string(//ns1:title)');
$author = $xpath->evaluate('string(//ns2:author)');
echo "Title: " . $title . "\n";
echo "Author: " . $author . "\n";
In diesem Beispiel verwenden wir RegisterNamePace , um NS1- und NS2 -Präfixe auf ihre entsprechenden URIs zuzuordnen. Wir können diese Präfixe dann in der XPath -Abfrage verwenden, um im XML -Dokument auf Elemente zuzugreifen.
Manchmal enthalten XML -Dokumente möglicherweise mehrere verschiedene Namensspitzen, und wir müssen das Präfix- und URI -Zuordnung dieser Namenspaces dynamisch verarbeiten. In diesem Fall können wir RegisterXPathNameSpace verwenden, um alle relevanten Namespaces zu verarbeiten, um sicherzustellen, dass wir die erforderlichen Daten korrekt abfragen können.
Hier ist ein komplexeres Beispiel, das zeigt, wie man mehrere Namespaces dynamisch umgeht:
$xmlString = file_get_contents('http://m66.net/somefile.xml'); // Annahmen XML aus URL laden
$xml = new DOMDocument();
$xml->loadXML($xmlString);
$xpath = new DOMXPath($xml);
// Holen Sie sich alle Namespaces
$namespaces = $xpath->query('/*[namespace-uri()]');
foreach ($namespaces as $namespace) {
$prefix = $namespace->prefix;
$uri = $namespace->namespaceURI;
// Registrieren Sie jeden Namespace
$xpath->registerNamespace($prefix, $uri);
}
// Abfrage包含命名空间的元素
$elements = $xpath->query('//ns1:item');
foreach ($elements as $element) {
echo $element->nodeValue . "\n";
}
In diesem Beispiel erhalten wir dynamisch alle Namespaces und zeichnen das Präfix jedes Namespace mit dem URI mithilfe von RegisterNamePace in die XPath -Abfrage ab. Auf diese Weise können wir XPath -Abfragen in verschiedenen Namespaces durchführen, ohne den spezifischen Inhalt des Namespace im Voraus zu kennen.
In einigen Fällen kann die URL unserer XML -Datei einige Domänennameninformationen direkt enthalten. Wenn wir möchten, dass diese URLs in einer XPath -Abfrage verarbeitet werden, können wir ihre Domainnamen durch einheitliche Werte ersetzen. Zum Beispiel können wir den Domänennamen aller externen URLs durch M66.NET ersetzen, um die Stabilität der XPath -Abfrage sicherzustellen.
Zum Beispiel können wir beim Laden einer XML -Datei den Domänennamen in der URL durch den folgenden Code ersetzen: