SimpleXML和PHP:提取XML文档的一部分并转换为数组 - php

考虑以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<OS>
    <data>
        <OSes>
            <centos>
                <v_5>
                    <i386>
                        <id>centos5-32</id>
                        <name>CentOS 5 - 32 bit</name>
                        <version>5</version>
                        <architecture>32</architecture>
                        <os>centos</os>
                    </i386>
                    <x86_64>
                        <id>centos5-64</id>
                        <name>CentOS 5 - 64 bit</name>
                        <version>5</version>
                        <architecture>64</architecture>
                        <os>centos</os>
                    </x86_64>
                </v_5>
                <v_6>
                    <i386>
                        <id>centos6-32</id>
                        <name>CentOS 6 - 32 bit</name>
                        <version>6</version>
                        <architecture>32</architecture>
                        <os>centos</os>
                    </i386>
                    <x86_64>
                        <id>centos6-64</id>
                        <name>CentOS 6 - 64 bit</name>
                        <version>6</version>
                        <architecture>64</architecture>
                        <os>centos</os>
                    </x86_64>
                </v_6>
            </centos>
            <ubuntu>
                <v_10>
                    <i386>
                        <id>ubuntu10-32</id>
                        <name>Ubuntu 10 - 32 bit</name>
                        <version>10</version>
                        <architecture>32</architecture>
                        <os>ubuntu</os>
                    </i386>
                    <amd64>
                        <id>ubuntu10-64</id>
                        <name>Ubuntu 10 - 64 bit</name>
                        <version>10</version>
                        <architecture>64</architecture>
                        <os>ubuntu</os>
                    </amd64>
                </v_10>
            </ubuntu>
        </OSes>
    </data>
</OS>

从上面的XML文档中,我想提取以下5个元素的节点

<id>
<name>
<version>
<architecture>
<os>

并将它们作为数组。我尝试执行以下操作:

<?php 
require_once "xml.php";

    try {
        $xml = new SimpleXMLElement($xmlstr);
        foreach($xml->xpath(' //id | //name | //version// | //architecture | //os ') as $record) {
        echo $record;
    }
    } catch(Exception $e){
        echo $e->getMessage();
    }

上面的代码有效,但每个记录都是一个单独的对象。我希望有人将所有5个元素节点合并为一个数组元素。像这样的东西:

$osList = Array( [0] => Array(
                               ["id"] => "<id>",
                               ["name"] => "<name>",
                               ["version"] => "<version>",
                               ....
)
 .....
);

语法不正确,但您明白了。任何想法如何做到这一点?

参考方案

这可能会有所帮助

$obj = new SimpleXMLElement($xml);
$rtn = array();
$cnt = 0;
foreach($obj->xpath('///OSes/*/*') as $rec)
{
  foreach ($rec as $rec_obj)
  {
    if (!isset($rtn[$cnt]))
    {
      $rtn[$cnt] = array();
    }

    foreach ($rec_obj as $name=>$val)
    {
      $rtn[$cnt][(string)$name] = (string)$val;
    }
    ++$cnt;
  }
}

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

PHP:检查谁看过发送的电子邮件? - php

我正在向某些用户发送电子邮件,并且想知道是谁阅读的,这意味着如果有人阅读了该电子邮件,则将维护一个日志文件,其中包含该用户的电子邮件地址以及日期/时间/ IP。为此,我发送一个带有电子邮件(html模板)的javascript函数,当用户打开该电子邮件时,它仅会警告用户的电子邮件地址,例如:for($n=0; $n<sizeof($checkBox);…

通过>和<运算符比较日期 - php

在我的所有php代码中,我都在UTC中存储日期和时间,但是我也在使用mysql存储日期时间(也在utc中)。大于和小于运算符会导致日期比较失败吗? $curdate=date('Y-m-d H:i:s'); if($start_datetime>$curdate) 参考方案 不。他们没有办法失败。为此,特意制作了MySQL日期格式。…

我如何在Safari浏览器中支持<video>? - php

我想在野生动物园浏览器中显示视频,当我刷新浏览器时,什么也没有发生,该怎么办?这是我的代码:<!doctype html> <html> <head> <title>Simple Movie Player</title> </head> <body> <video sr…

XPath表达式在<br>标记后获取字符串 - php

我正在尝试获取article/div/p中的内容,但仅获取<br>标记后的日期。怎么做?<article> <h2>Man rescued after falling into Crater Lake</h2> <p class="summary highlight"> Man …