麻烦用php和xml

时间:2013-04-03 19:55:00

标签: php xml xpath

我正在尝试使用php来处理几个xml文件。我已经阅读了php simpleXML网站上的解释和一些例子,但是我无法从xml中得到我想要的东西。
我无法控制xml。这是xml文件的片段:

<end-user-emails>
    <user email="test@testemails.com"/>
</end-user-emails>

我目前拥有的一段代码:

$result = $xml->xpath("end-user-emails/user[@email]");
print_r($result[0][email]);

哪个输出:

SimpleXMLElement Object ( [0] => test@testemails.com ) 

我找不到简单返回属性值的方法 我已经尝试将其转换为字符串并获取错误。 我尝试了几种变体:

$result = $xml->end-user-emails[0]->user[0]->attributes();

它告诉我,尽管有上一个输出,但我无法调用attributes(),因为它没有在对象上调用。

所以,如果有人能让我知道如何从xml中获取属性名称和值,那将非常感激。属性名称不是必要的,但我想使用它,所以我可以检查我实际上是在抓一封电子邮件,例如:

if attributeName = "email" then $email = attributevalue

2 个答案:

答案 0 :(得分:2)

attributes()方法会返回一个像对象一样的数组,所以这应该做你想要的,但只能用php 5.4 +

$str = '
<end-user-emails>
    <user email="test@testemails.com"/>
</end-user-emails>';
$xml = simplexml_load_string($str);
// grab users with email
$user = $xml->xpath('//end-user-emails/user[@email]');
// print the first one's email attribute
var_dump((string)$user[0]->attributes()['email']);

如果您使用的是php5.3,则必须循环遍历属性(),如下所示:

foreach ($user[0]->attributes() as $attr_name => $attr_value) {
    if ($attr_name == 'email') {
        var_dump($attr_name, (string)$attr_value);
    }
}

您也可以在该变量上分配->attributes()的返回值并使用['email']。如果您事先不知道属性名称,循环也很有用。

答案 1 :(得分:1)

要获取用户的电子邮件地址(在您的示例中),请将xml加载到对象中,然后解析每个项目。我希望这会有所帮助。

//load the data into a simple xml object
$xml = simplexml_load_file($file, null, LIBXML_NOCDATA);
//parse over the data and manipulate
foreach ($xml->action as $item) {
    $email = $item->end-user-emails['email'];
    echo $email;

}//end for

有关详细信息,请参阅http://php.net/manual/en/function.simplexml-load-file.php