SimpleXML和XML集合 - 如何将属性值作为数组键获取?

时间:2011-05-31 13:46:32

标签: php simplexml

我只是想弄清楚如何干净利落地将XML集合转换为适当的对象。看,我有这个非常简单的XML字符串:

$x = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<apiKeys>
    <apiKey application="app1">HfxaoMBJJ9pLe</apiKey>
    <apiKey application="app2">HfxaoMBJJ9pLeClsSHsh</apiKey>
    <apiKey application="app3">HfxaoMBJJ9pLeClsSHshTI9qX</apiKey>
</apiKeys>';

我使用以下方法进行转换:

$O_xmlElement   = simplexml_load_string ($x);

这就是我得到的:

SimpleXMLElement Object
(
    [apiKey] => Array
        (
            [0] => HfxaoMBJJ9pLe
            [1] => HfxaoMBJJ9pLeClsSHsh
            [2] => HfxaoMBJJ9pLeClsSHshTI9qX
        )

)

我宁愿(我期待!)之类的东西:

SimpleXMLElement Object
(
    [apiKey] => Array
        (
            ['app1'] => HfxaoMBJJ9pLe
            ['app2'] => HfxaoMBJJ9pLeClsSHsh
            ['app3'] => HfxaoMBJJ9pLeClsSHshTI9qX
        )

)

非常感谢您的帮助

3 个答案:

答案 0 :(得分:1)

SimpleXML不会自动执行您想要的操作。你必须自己构建对象:

$O_xmlElement = simplexml_load_string($x);
$myObject = new stdClass();
foreach ($O_xmlElement->apiKey as $apiKey) {
    $key = (string) $apiKey['application'];
    $myObject->${key} = (string) $apiKey;
}

有关处理子元素和属性的好例子,请参阅PHP手册中的basic usage example

从SimpleXMLElement获取属性时,请记住每个属性都是SimpleXMLElement而不是字符串。在将每个属性用作数组键或对象属性名称之前,您需要将每个属性显式地转换为字符串。

答案 1 :(得分:0)

不确定你能否完全按照自己的意愿去做,但你可以在这里查看php.net的文档: http://www.php.net/manual/en/simplexmlelement.attributes.php

基本上,属性可以在附加到每个apiKey对象的对象中找到。

答案 2 :(得分:0)

您可以使用以下代码:

$xml = simplexml_load_string($x); 
$newArray = array(); 
$count=0;
foreach($xml as $value){ 
    $key= (string)($xml->apiKey[$count++]->attributes()->application);
    $newArray[$key] = $value[0]; 
} 
$newArray = array_map("trim", $newArray); 
print_r($newArray);

这将生成以下输出:

Array
(
    [app1] => HfxaoMBJJ9pLe
    [app2] => HfxaoMBJJ9pLeClsSHsh
    [app3] => HfxaoMBJJ9pLeClsSHshTI9qX
)