SimpleXMLElement命名空间有问题

时间:2019-05-28 17:12:01

标签: php xml simplexml

我在使用SimpleXMLElement解析XML和命名空间时遇到了麻烦。

我尝试使用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";
}

我希望获得Organisationnamevariant-> mainname项目的列表:

Academia lugduno-batava
Leiden university
Leidse universiteit
etc.

但是,我遇到此错误:试图获取非对象的属性

1 个答案:

答案 0 :(得分:1)

使用常规的->结构很难导航到如此深的层次结构,但是在更改名称空间时也必须小心。您只需执行一次->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结尾,因此我倾向于将大小写添加到字符串中,以便重点。