Так что функция XML в JSON, которую я обнаружил, работает отлично, но она не будет работать для моих нужд, потому что она включает пространство имен в имя ключа, и мне нужно удалить пространство имен из ключей.
Проблема заключается в том, что при включении пространств имен в элементы XML преобразование в массив или JSON дочерних узлов с пространством имен удаляется. Я понял, что если я удалю пространство имен из строки XML перед тем, как преобразовать строку в элемент XML, то функция json_encode будет работать, как ожидается, и данные не будут удалены.
Итак, для всех, у кого есть эта проблема, вот как я решил проблему для своих нужд.
Я знаю, что отправляемый мне XML не имеет конфликтов имен. Единственная причина, по которой пространства имен используются, состоит в том, чтобы идентифицировать источник этой части данных XML.
Я знаю все используемые пространства имен
Имея эту информацию здесь, я и сделал
function removeNamespaceFromXML( $xml )
{
// Because I know all of the the namespaces that will possibly appear in
// in the XML string I can just hard code them and check for
// them to remove them
$toRemove = ['rap', 'turss', 'crim', 'cred', 'j', 'rap-code', 'evic'];
// This is part of a regex I will use to remove the namespace declaration from string
$nameSpaceDefRegEx = '(\S+)=["\']?((?:.(?!["\']?\s+(?:\S+)=|[>"\']))+.)["\']?';
// Cycle through each namespace and remove it from the XML string
foreach( $toRemove as $remove ) {
// First remove the namespace from the opening of the tag
$xml = str_replace('<' . $remove . ':', '<', $xml);
// Now remove the namespace from the closing of the tag
$xml = str_replace('</' . $remove . ':', '</', $xml);
// This XML uses the name space with CommentText, so remove that too
$xml = str_replace($remove . ':commentText', 'commentText', $xml);
// Complete the pattern for RegEx to remove this namespace declaration
$pattern = "/xmlns:{$remove}{$nameSpaceDefRegEx}/";
// Remove the actual namespace declaration using the Pattern
$xml = preg_replace($pattern, '', $xml, 1);
}
// Return sanitized and cleaned up XML with no namespaces
return $xml;
}
function namespacedXMLToArray($xml)
{
// One function to both clean the XML string and return an array
return json_decode(json_encode(simplexml_load_string(removeNamespaceFromXML($xml))), true);
}
Вызывая функцию namespacedXMLToArray (), я могу просто получить массив, который на 100% хорош в моем случае.
Надеюсь, этот подход поможет другим. Я уверен, что если вы не знаете, какие существуют возможные пространства имен, вы можете использовать RegEx, чтобы найти различные определенные пространства имен, а затем удалить их, как только узнаете их имена.