Когда вы просто хотите, чтобы ваш xml, проанализированный, использовался, и вам не нужны какие-либо пространства имен, вы просто удаляете их. Регулярные выражения хороши и намного быстрее, чем мой метод ниже.
Но для более безопасного подхода при удалении пространств имен можно проанализировать xml с помощью SimpleXML и запросить имеющиеся у него пространства имен, как показано ниже:
$xml = '...';
$namespaces = simplexml_load_string($xml)->getDocNamespaces(true);
//The line bellow fetches default namespace with empty key, like this: '' => 'url'
//So we remove any default namespace from the array
$namespaces = array_filter(array_keys($namespaces), function($k){return !empty($k);});
$namespaces = array_map(function($ns){return "$ns:";}, $namespaces);
$ns_clean_xml = str_replace("xmlns=", "ns=", $xml);
$ns_clean_xml = str_replace($namespaces, array_fill(0, count($namespaces), ''), $ns_clean_xml);
$xml_obj = simplexml_load_string($ns_clean_xml);
Таким образом, вы нажимаете заменить только для пространств имен, избегая удаления всего, что может быть в xml.
На самом деле я использую его как метод:
function refined_simplexml_load_string($xml_string) {
if(false === ($x1 = simplexml_load_string($xml_string)) ) return false;
$namespaces = array_keys($x1->getDocNamespaces(true));
$namespaces = array_filter($namespaces, function($k){return !empty($k);});
$namespaces = array_map(function($ns){return "$ns:";}, $namespaces);
return simplexml_load_string($ns_clean_xml = str_replace(
array_merge(["xmlns="], $namespaces),
array_merge(["ns="], array_fill(0, count($namespaces), '')),
$xml_string
));
}
person
AlexisAmasis
schedule
07.02.2021