使用PHP有条件地解析XML属性

时间:2010-10-13 21:00:54

标签: php xml parsing conditional

我真的希望有人能帮助我。

基本上,我试图根据该分支中的其他属性解析XML树中的某些XML属性。

作为我正在使用的XML类型的一个例子: -

<root>
<employees>
  <team id="1643">
    <member id ="153461" jobtype="permament" division="cleaning" rollnumber="1364"/>
    <member id ="153461" jobtype="temporary" division="reception" rollnumber="1326"/>
    <member id ="153461" jobtype="parttime" division="cleaning" rollnumber="1312"/>
    <member id ="153461" jobtype="permament" division="cleaning" rollnumber="1326"/>
  </team>
  <team id="1633">
    <member id ="153461" jobtype="permament" division="cleaning" rollnumber="1244"/>
    <member id ="153461" jobtype="temporary" division="reception" rollnumber="1569"/>
    <member id ="153461" jobtype="parttime" division="cleaning" rollnumber="1472"/>
    <member id ="153461" jobtype="permament" division="cleaning" rollnumber="1112"/>
  </team>
  <team id="1674">
    <member id ="153461" jobtype="permament" division="cleaning" rollnumber="1488"/>
    <member id ="153461" jobtype="temporary" division="reception" rollnumber="1032"/>
    <member id ="153461" jobtype="parttime" division="cleaning" rollnumber="1886"/>
    <member id ="153461" jobtype="permament" division="cleaning" rollnumber="1445"/>
  </team>
</employees>
</root>

我要做的是为所有填写某些类别的员工获取rollnumber。所以我希望能够做一个看起来像“如果jobtype =”permanent“和division =”cleaning“那么echo rollnumber”

现在,我试图用PHP解析它,基本上失败了。我失败了,因为我使用的语法如下: -

$team->xpath("//member[@jobtype='permament'][@division='cleaning']/@rollnumber")

这解析为数组。没问题。我可以将变量拉出数组。没问题。

问题是这个......

... PHP无法处理此代码生成的嵌套数组。它将初始数组保存在内存中,只是一遍又一遍地解析相同的变量。我已经尝试在每个循环结束时重置数组等,但这不起作用。 PHP似乎只能在foreach序列结束时销毁数组。

我真的想知道是否可以用PHP解析它?有没有解决这个问题?任何帮助/建议都会非常感激。

1 个答案:

答案 0 :(得分:0)

所以这就是我要做的事情

//解析XML.class.php

/**
 * This is the base class to load the XML.
 * Individual scripts should extend this class for 
 * explicit functionality  
 */

class ParseXML {
    protected $xml;

    public function __construct($xml) {
        if(is_file($xml)) {
            $this->xml = simplexml_load_file($xml);
        } else {
            $this->xml = simplexml_load_string($xml);
        }
    }
}

//解析Employees.extends.php

/**
 * This class extends the parseXML class
 */
class ParseEmployees extends parseXML {

    public function getRollNumberArray() {
        $attr = false;
        $el = $this->xml->xpath("//member[@jobtype='permament'][@division='cleaning']");

        if($el && count($el) === 1) {
            $attr = (array) $el[0]->attributes();
            $attr = $attr['@attributes'];
        } 
        return $attr;
    }
}

使用方法:

// Add xml file/post
$xml_file = '/path/to/xml_file.xml';

// Need to include the two files above
include('ParseXML.class.php');
include('ParseEmployees.extends.php');

$emp = new ParseEmployees($xml_file);
$emp_rollnumber_arr = $emp->getRollNumberArray();

// Now you should be able to access the array and see the values
echo "Employees Role Numbers:<pre>".print_r($emp_rollnumber_arr,true)."</pre><br />";