Проблема с пространствами имен SimpleXMLElement - PullRequest
1 голос
/ 28 мая 2019

У меня проблемы с анализом XML с помощью пространств имен с использованием SimpleXMLElement.

Я пытался использовать циклический просмотр xml, а также безуспешно пытался использовать xpath.

$data_url="http://isni.oclc.nl/sru/0000000123121970?query=pica.isn+%3D+%220000000123121970%22&version=1.1&operation=searchRetrieve&stylesheet=http%3A%2F%2Fisni.oclc.nl%2Fsru%2FDB%3D1.2%2F%3Fxsl%3DsearchRetrieveResponse&recordSchema=isni-b&maximumRecords=10&startRecord=1&recordPacking=xml&sortKeys=none&x-info-5-mg-requestGroupings=none";
$data = file_get_contents($data_url);
$xml = simplexml_load_string($data);

$org_names = $xml->children('srw', true)->records->children('srw', true)->record->children('srw', true)->recordData->responseRecord->isniassigned->isnimetadata->identity->organisation->organisationnamevariant->mainname;

foreach($org_names as $a) 
{
  echo "a: $a\n";
}

Я ожидаю получить список наименований вариантов организации-> mainname:

Academia lugduno-batava
Leiden university
Leidse universiteit
etc.

Однако, я получаю эту ошибку: Попытка получить свойство необъекта

1 Ответ

1 голос
/ 28 мая 2019

С такой глубокой иерархией трудно ориентироваться, используя обычную структуру ->, но вы также должны быть осторожны при изменении пространства имен.Вам нужно только сделать ->children('srw', true) один раз, и тогда все дочерние узлы будут для этого пространства имен.НО вы также должны переключиться обратно на <responseRecord>, используя ->children().

. Вы также должны быть осторожны, чтобы использовать правильный регистр для каждого имени тега ...

$org_names = $xml->children('srw', true)->records->record->recordData->children()->
       responseRecord->ISNIAssigned->ISNIMetadata->identity->organisation->
       organisationNameVariant->mainName;

echo (string)$org_names;

Альтернативой является использование XPath (поскольку xpath() возвращает список совпадений, я использую [0], чтобы использовать только первое) ...

$org_names = $xml->xpath("//organisationNameVariant/mainName");

echo (string)$org_names[0];

Я знаю, что echo приводит кзначение в строку, но если вы используете это в любом другом сценарии, вы можете вместо этого получить SimpleXMLElement, поэтому я склоняюсь к добавлению регистра в строку просто для того, чтобы подчеркнуть это.

...