Удалить пространство имен из 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 файла.
Спасибо!
Ответы
Ответ 1
Если вы используете XPath, тогда это ограничение с XPath и не PHP рассмотрит это объяснение на xpath и пространства имен по умолчанию для получения дополнительной информации.
В частности, это атрибут xmlns=""
в корневом каталоге node, который вызывает проблему. Это означает, что вам нужно будет зарегистрировать пространство имен, а затем использовать 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.
Ответ 2
Я нашел ответ выше, чтобы быть полезным, но это не сработало для меня.
Это оказалось лучше:
// 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);
Ответ 3
Чтобы полностью удалить пространство имен, вам необходимо использовать регулярные выражения (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, что может привести к неожиданным результатам.
Ответ 4
Следующий 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';