2016-12-07 84 views
0

我有下面的XML:PHP SimpleXMLElement对象获取数据

<Root> 
    <personalData> 
     <userName>John Tom</userName> 
     <email>[email protected]</email> 
    </personalData> 
    <profesionalData> 
     <job>engineer</job> 
     <jobId>16957</jobId> 
    </profesionalData> 
</Root> 

在我的调试器做:

$myObject->xpath('//Root/profesionalData') 

我:

: array = 
    0: object(SimpleXMLElement) = 
    job: string = engineer  
    jobId: string = 16957 

我不能得到jobId的保持16957

我有什么做的?

+0

尝试'$ myObject->的XPath( '//根/ profesionalData')[0] - > jobId' –

回答

1
$root = simplexml_load_file('file.xml'); 


$job_ids = $root->xpath('//profesionalData/jobId'); 

if (!$job_ids) { 
    die("Job IDs not found"); 
} 

foreach ($job_ids as $id) { 
    // SimpleXmlElement implements __toString method, so 
    // you can fetch the vlaue by casting the object to string. 
    $id = (string)$id; 
    var_dump($id); 
} 

样本输出

string(5) "16957" 

注意

你不需要在XPath表达式指定Root,如果你要获取所有profesionalData/jobId标签无论身在何处他们在文档中,只需使用双斜杠(//)表达式。如果您想避免注册XML名称空间,这种方法可能很方便。否则,您可以使用严格的表达式,如/Root/profesionalData/jobId(根路径)。顺便说一句,您的当前表达式(//Root/profesionalData/jobId)的/Root/profesionalData/jobId所有出现相匹配的文件中,例如/x/y/z/Root/profesionalData/jobId

由于SimpleXmlElement::xpath函数成功返回一个数组,或者在故障时返回FALSE,如果它是非空数组,则应该用循环迭代该值。

SimpleXmlElement实现__toString方法。该方法在对象出现在字符串上下文中时调用。特别是,你可以cast对象为字符串,以获取节点的字符串内容。

+0

呃..这将永远是因为你的'if'的失败! –

+1

@PraveenKumar,谢谢。固定 –

+0

第一个音符是错误的。 '//'不指向'Root'元素,但它是对其父节点的引用(在这种情况下)。位置路径开始处的'/'指向文档本身,'//'是后代轴。所以'//根/ profesionalData'将寻找是一个'Root'元素节点的直接子任何'profesionalData'元素节点。 – ThW