Frage

Ich habe ein XML -Dokument, das so aussieht:

<Data 
  xmlns="http://www.domain.com/schema/data" 
  xmlns:dmd="http://www.domain.com/schema/data-metadata"
>
  <Something>...</Something>
</Data>

Ich analysiere die Informationen mit Simplexml in PHP. Ich habe es mit Arrays zu tun und habe ein Problem mit dem Namespace.

Meine Frage ist: Wie entferne ich diese Namespaces? Ich habe die Daten aus einer XML -Datei gelesen.

Vielen Dank!

War es hilfreich?

Lösung

Wenn Sie XPath verwenden, ist es eine Einschränkung mit XPath und nicht PHP sehen Sie sich diese Erklärung an XPATH- und Standard -Namespaces Für mehr Information.

Genauer gesagt ist es das xmlns="" Attribut im Stammknoten, das das Problem verursacht. Dies bedeutet, dass Sie den Namespace registrieren müssen und dann a verwenden müssen Qname danach auf Elemente beziehen.

$feed = simplexml_load_file('http://www.sitepoint.com/recent.rdf');
$feed->registerXPathNamespace("a", "http://www.domain.com/schema/data");
$result = $feed->xpath("a:Data/a:Something/...");

Wichtig: Der Uri, der in der verwendet wird registerXPathNamespace Der Anruf muss identisch sein mit dem, der in der tatsächlichen XML -Datei verwendet wird.

Andere Tipps

Ich fand, dass die Antwort oben hilfreich war, aber es hat bei mir nicht ganz funktioniert. Dies funktionierte besser:

// Gets rid of all namespace definitions 
$xml_string = preg_replace('/xmlns[^=]*="[^"]*"/i', '', $xml_string);

// Gets rid of all namespace references
$xml_string = preg_replace('/[a-zA-Z]+:([a-zA-Z]+[=>])/', '$1', $xml_string);

Der folgende PHP -Code erkennt automatisch den in der XML -Datei festgelegten Standard -Namespace unter der alias -Standardeinstellung. Nein, alle XPath -Abfragen müssen aktualisiert werden, um das Präfix einzuschließen default:

Wenn Sie also XML -Dateien lesen möchten, enthalten sie eine Standard -NS -Definition oder nicht und Sie möchten alle abfragen Something Elemente können Sie den folgenden Code verwenden:

$xml = simplexml_load_file($name);
$namespaces = $xml->getDocNamespaces();
if (isset($namespaces[''])) {
    $defaultNamespaceUrl = $namespaces[''];
    $xml->registerXPathNamespace('default', $defaultNamespaceUrl);
    $nsprefix = 'default:';
} else {
    $nsprefix = '';
}

$somethings = $xml->xpath('//'.$nsprefix.'Something');

echo count($somethings).' times found';

Um den Namespace vollständig zu entfernen, müssen Sie reguläre Ausdrücke (Regex) verwenden. Zum Beispiel:

$feed = file_get_contents("http://www.sitepoint.com/recent.rdf");
$feed = preg_replace("/<.*(xmlns *= *[\"'].[^\"']*[\"']).[^>]*>/i", "", $feed); // This removes ALL default namespaces.
$xml_feed = simplexml_load_string($feed);

Dann haben Sie alle XML -Namespaces entzogen, bevor Sie das XML geladen haben (seien Sie mit dem Regex durch, denn wenn Sie Felder mit so etwas wie folgt haben:

<![CDATA[ <Transfer xmlns="http://redeux.example.com">cool.</Transfer> ]]>

Anschließend werden die XMLNs innerhalb der CDATA ausgestattet, was zu unerwarteten Ergebnissen führen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top