Условный анализ атрибутов XML с помощью PHP - PullRequest
0 голосов
/ 14 октября 2010

Я действительно надеюсь, что кто-нибудь может мне помочь с этим.

По сути, я пытаюсь проанализировать определенные атрибуты 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>

То, что я пытаюсь сделать, - это набрать порядковый номер для всех сотрудников, которые относятся к определенным категориям. Поэтому я хочу иметь возможность сделать что-то похожее на "Если jobtype =" постоянный "и подразделение =" чистка ", то echo rollnumber" .

Теперь я попытался разобрать это с помощью PHP, но в основном не получилось. Я потерпел неудачу, потому что я использовал такой синтаксис: -

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

Это анализируется как массив. Нет проблем. Я могу вытащить переменные из массива. Нет проблем.

Проблема в том ...

... PHP не может работать с вложенными массивами, которые генерирует этот код. Он хранит исходный массив в памяти и просто анализирует одни и те же переменные снова и снова. Я пытался сбросить массив и т.д. в конце каждого цикла, но это не сработало. PHP только кажется способным уничтожить массив в конце последовательности foreach.

Мне бы очень хотелось узнать, возможно ли это проанализировать с помощью PHP? Есть ли обходной путь для этого? Буду очень признателен за любую помощь / совет.

1 Ответ

0 голосов
/ 14 октября 2010

Так вот как бы я это сделал

// ParseXML.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);
        }
    }
}

// ParseEmployees.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;
    }
}

Как использовать:

<code>// 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)."

";
...