Utilize um FilterIterator para filtrar elementos na árvore de mensagens.
class ToughenedSteelPartsIterator extends FilterIterator
{
public function __construct(Iterator $it)
{
parent::__construct($it);
}
function accept()
{
/*** only check components ***/
if (!strcmp($this->key(),"component"))
{
/*** Return true for Toughened Steel ***/
if (!strcmp($this->current()->material,"Toughened Steel"))
{
return true;
}
}
return false;
}
}
class PhpComputeNode_Iterator_Filter
{
/**
* @MessageBrokerSimpleTransform
*/
função avaliar($output_assembly, $input_assembly) {
ob_start();
echo "\nIterating over parts which have a material name of Toughened Steel\n";
$it = new MbsElementIterator($input_assembly->XMLNSC->getFirstChild());
$rii = new ToughenedSteelPartsIterator(new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST));
foreach($rii as $key=>$value)
{
echo $key.' = '.$value->name." ".$value->price." ".$value->material."\n";
}
$output_assembly->XMLNSC->results->contents = ob_get_contents();
ob_end_clean();
}
}
<machine>
<assembly name="Extremidade Superior do Bloco do Motor">
<assembly name="Cabeçote do Cilindro">
<assembly name="Conjunto do Excêntrico">
<component name="Excêntrico" price="3.50" material="Aço Temperado"/>
<component name="Mola Helicoidal" price="1.50" material="Aço Temperado"/>
<component name="Anel" price="1.50" material="Aço Temperado"/>
<component name="Anel" price="1.50" material="Aço Temperado"/>
<component name="Assento" price="3.50" material="Aço Temperado"/>
</assembly>
<assembly name="Eixo Excêntrico">
<component name="Eixo" price="3.50" material="Aço Macio"/>
<component name="Excêntrico" price="1.50" material="Aço Temperado" />
<component name="Excêntrico" price="1.50" material="Aço Temperado" />
<component name="Excêntrico" price="1.50" material="Aço Temperado" />
<component name="Excêntrico" price="1.50" material="Aço Temperado" />
<component name="Rolamento" price="1.00" material="Aço Temperado" />
<component name="Rolamento" price="1.00" material="Aço Temperado" />
<component name="Dente de Roda de Corrente Excêntrico" price="4.20" material="Aço Temperado" />
<component name="Corrente do Excêntrico" price="4.20" material="Aço Temperado" />
<component name="Tensionador" price="0.50" material="Plástico" />
</assembly>
<component name="Cabeçote" price="12.40" material="Liga" />
<component name="Plugue" price="3.00" material="Baquelite/Aço" />
</assembly>
<assembly name="Bloco do Cilindro">
<component name="Cilindro" price="20.00" material="Liga" />
<component name="Luva" price="10.00" material="Aço Temperado" />
</assembly>
<assembly name="Carburador">
<assembly name="Conjunto do Pistão"/>
<component name="Pistão" price="20.00" material="Aço Temperado" />
<component name="Anel" price="10.00" material="Aço Temperado" />
<component name="Anel" price="10.00" material="Aço Temperado" />
<component name="Haste do Excêntrico" price="10.00" material="Aço Temperado" />
</assembly>
</assembly>
</machine>
<results><contents>
Fazendo a iteração sobre as peças que possuem um nome de material Aço Temperado
component = Excêntrico de 3,50 de Aço Temperado
component = Assento de 3,50 de Aço Temperado
component = Excêntrico de 1,50 de Aço Temperado
component = Excêntrico de 1,50 de Aço Temperado
component = Excêntrico de 1,50 de Aço Temperado
component = Excêntrico de 1,50 de Aço Temperado
component = Rolamento de 1,00 de Aço Temperado
component = Rolamento de 1,00 de Aço Temperado
component = Dente de Roda da Corrente do Excêntrico de 4,20 de Aço Temperado
component = Corrente do Excêntrico de 4,20 de Aço Temperado
component = Luva de 10,00 de Aço Temperado
component = Pistão de 20,00 de Aço Temperado
component = Haste do Excêntrico de 10,00 de Aço Temperado
</contents></results>
Para obter informações adicionais sobre a classe MbsElementIterator, consulte MbsElementIterator.