首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleXMLElement名称空间的问题

SimpleXMLElement名称空间的问题
EN

Stack Overflow用户
提问于 2019-05-29 01:12:01
回答 1查看 32关注 0票数 1

我在使用SimpleXMLElement解析带有名称空间的XML时遇到了问题。

我尝试过在xml中使用循环,也尝试过使用xpath,但没有成功。

代码语言:javascript
复制
$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";
}

我希望得到一份组织名称变量->主名称项目的列表:

代码语言:javascript
复制
Academia lugduno-batava
Leiden university
Leidse universiteit
etc.

然而,我得到了这个错误:试图获取非对象的属性

EN

回答 1

Stack Overflow用户

发布于 2019-05-29 01:37:19

使用普通的->结构很难导航到如此深的层次结构,但在更改名称空间时也必须小心。您只需执行一次->children('srw', true),然后所有的子节点都将用于该名称空间。但您还必须使用->children()切换回<responseRecord>

您还需要注意为每个标记名称使用正确的大小写...

代码语言:javascript
复制
$org_names = $xml->children('srw', true)->records->record->recordData->children()->
       responseRecord->ISNIAssigned->ISNIMetadata->identity->organisation->
       organisationNameVariant->mainName;

echo (string)$org_names;

另一种选择是使用XPath (因为xpath()返回一个匹配列表,我使用[0]只使用第一个匹配列表)……

代码语言:javascript
复制
$org_names = $xml->xpath("//organisationNameVariant/mainName");

echo (string)$org_names[0];

我知道echo将值转换为字符串,但是如果您在任何其他场景中使用此方法,您可能最终会得到一个SimpleXMLElement,所以我倾向于将大小写添加到string中,以便说明这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56347157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档