Back-End

14 jan, 2013

Processamento de XML com uma chamada PHP única – Parte 02

Publicidade

O PHP oferece várias extensões para analisar documentos XML, mas você ainda tem que escrever um monte de códigos personalizados para validar e extrair dados da XML analisada.

Leia este artigo para aprender como usar essa classe parser XML para validar e extrair os dados de análise de documentos XML com uma quantidade mínima de código que requer apenas uma única chamada para a classe. Na primeira parte do artigo, vimos os tópicos: “XML é chato, mas ainda precisamos lidar com ela”, “Suporte a XML PHP” e “Solução da classe XML Parser para validar e extrair dados em uma única chamada”. Agora veremos a  “Implementação de regras de validação personalizadas” e a “Conclusão”.

Implementação de regras de validação personalizadas

Como você deve ter notado na primeira parte desse artigo, o documento processado utiliza apenas tipos de dados básicos que podem ser validados apenas com as regras suportadas embutidas. Os tipos mais comuns e as regras de validação podem ser adicionados no futuro. No entanto, nos documentos mais realistas de XML, você pode precisar implementar regras de validação que não são suportados pela classe e, provavelmente, nunca serão. Isso porque essas regras, geralmente, possuem uma muito aplicação específica.

A forma de resolver esse problema é a criação de uma sub-classe e a substituição da função ValidateElementData. Essa função existe especificamente com a finalidade de implementar regras de validação personalizadas.

Vamos dizer que você queria processar um documento XML com várias pessoas e você precisava processar a desautorização de várias pessoas com o mesmo nome:

<people>

<person>
<name>Some Name</name>
<address>Address line 1</address>
<address>Address line 2</address>
<age>33</age>
</person>

<person>
<name>Some Name</name>
<address>Address line 1</address>
<address>Address line 2</address>
<age>66</age>
</person>

</people>

Primeiramente, você precisa de uma extensão de sub-classe da xml_parser_class para implementar a função ValidateElementData. Em seguida, você precisa criar um objeto parser da sub-classe a qual você definiu:

classmy_custom_xml_parser_class extends xml_parser_class
{
// keep track of the names of the people
var $people = array();

Function ValidateElementData($validation, $path, &$value,
&$result)
{
switch($validation)
{
case 'unique person':
// check if another person was set with the same name
if(IsSet($this->people[$value]))
{
// set the error entry of the return result parameter
$result['error'] =
'multiple people were defined with the name "'.
$value.'"';
}
else
{
$this->people[$value] = $path;
}
// return an empty string when there was
return('');
default:
return($validation.
' is not a supported type of validation');
}
}
};

$parser = new my_custom_xml_parser_class;

Então, você teria que definir os tipos para fazer a classe chamar a nova sub-classe para validar o nome de cada pessoa com este código personalizado. Observe o parâmetro “validação” definido como “pessoa singular” para o ‘nome’ tag:

$types = array(
'people'=>array(
'type'=>'hash',
'types'=>array(
'person'=>array(
'type'=>'hash',
'maximum'=>'*',
'types'=>array(
'name'=>array(
'type'=>'text',
'validation'=>'unique person'
),
'address'=>array(
'type'=>'text',
'maximum'=>'*'
),
'age'=>array(
'type'=>'integer',
'minimumvalue'=>'18'
)
)
)
)
)
);

Conclusão

O processamento de documentos XML pode ser uma coisa chata de se fazer. Esta classe tenta minimizar isso, evitando a necessidade de escrever códigos nodes personalizados transversais nodes do documento XML para validar e extrair dados de qualquer formato XML.

A classe implementa outras funcionalidades que não foram abordadas aqui, como extração de atributos XML, namespaces XML e tratamento de erros. Sinta-se livre para verificar os exemplos de scripts disponíveis na documentação para saber mais sobre esses detalhes.

***

Artigo original disponível em: http://www.phpclasses.org/blog/package/4/post/1-Processing-XML-with-a-single-PHP-call.html