我在使用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.
但是,我遇到此错误:试图获取非对象的属性
答案 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结尾,因此我倾向于将大小写添加到字符串中,以便重点。