我在使用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";
}我希望得到一份组织名称变量->主名称项目的列表:
Academia lugduno-batava
Leiden university
Leidse universiteit
etc.然而,我得到了这个错误:试图获取非对象的属性
发布于 2019-05-29 01:37:19
使用普通的->结构很难导航到如此深的层次结构,但在更改名称空间时也必须小心。您只需执行一次->children('srw', true),然后所有的子节点都将用于该名称空间。但您还必须使用->children()切换回<responseRecord>。
您还需要注意为每个标记名称使用正确的大小写...
$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,所以我倾向于将大小写添加到string中,以便说明这一点。
https://stackoverflow.com/questions/56347157
复制相似问题