2010-10-13 2 views
0

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

В принципе, я пытаюсь проанализировать определенные 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 =« постоянный »и деление =« очистка », то эхо-число«.

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

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

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

Проблема заключается в ...

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

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

ответ

0

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

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

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

// 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 />"; 
+0

Большое спасибо. Я должен сказать, что материал немного более продвинут, чем то, к чему я привык. – user475018

+0

Могу ли я спросить, нужно ли это встраивать в цикл foreach для итерации дерева XML? – user475018

Смежные вопросы