Удалить пространство имен из XML с помощью PHP

У меня есть XML-документ, который выглядит так:

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

Я анализирую информацию, используя SimpleXML в PHP. Я имею дело с массивами, и у меня, похоже, проблема с пространством имен.

Мой вопрос: как удалить эти пространства имен? Я прочитал данные из файла XML.

Спасибо!

Если вы используете XPath, то это ограничение с XPath, а не PHP, посмотрите на это объяснение в пространствах имен xpath и default для получения дополнительной информации.

Более конкретно, его атрибут xmlns="" в корневом узле, который вызывает проблему. Это означает, что вам нужно будет зарегистрировать пространство имен, а затем использовать QName для ссылки на элементы.

 $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/..."); 

Важно : URI, используемый в вызове registerXPathNamespace должен быть идентичным тому, который используется в фактическом файле XML.

Я нашел ответ выше, чтобы быть полезным, но это не совсем сработало для меня. Это оказалось лучше:

 // 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); 

Следующий PHP-код автоматически определяет пространство имен по умолчанию, указанное в файле XML под псевдонимом «default». Нет всех запросов xpath, которые необходимо обновить, чтобы включить префикс по default:

Поэтому, если вы хотите читать XML-файлы, они содержат определение NS по умолчанию или их нет, и вы хотите запросить все элементы Something , вы можете использовать следующий код:

 $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'; 

Чтобы полностью удалить пространство имен, вам необходимо использовать регулярные выражения (RegEx). Например:

 $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); 

Затем вы удалили любые пространства имен xml перед загрузкой XML (будьте осторожны с регулярным выражением, потому что, если у вас есть поля с чем-то вроде:

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

Затем он удалит xmlns изнутри CDATA, что может привести к неожиданным результатам.