Pergunta

Esta questão já tem uma resposta aqui:

Eu tenho usado o Analisador XML antes, e mesmo que trabalhou OK, eu não estava feliz com isso, em geral, parecia que eu estava usando soluções alternativas para as coisas que devem ser funcionalidade básica.

Recentemente, vi SimpleXML, mas eu não tentei ainda. É mais simples? Quais as vantagens e desvantagens que ambos têm? Quaisquer outros analisadores que você usou?

Foi útil?

Solução

Eu teria que dizer SimpleXML leva o bolo porque é em primeiro lugar uma extensão, escrito em C, e é muito rápido. Mas em segundo lugar, o documento analisado assume a forma de um objeto PHP. Então você pode "consulta" como $root->myElement.

Outras dicas

Tenha um olhar em PHP do extensões XML disponíveis e veja http://devzone.zend.com/243/ e http://devzone.zend.com/1035/ para uma discussão desses.

A principal diferença entre XML Parser e SimpleXML é que este não é um analisador pull. SimpleXML é construído em cima das extensões DOM e irá carregar todo o arquivo XML na memória. XML Parser como XMLReader só irá carregar o nó atual na memória. Você define manipuladores para nós específicos que se desencadeou quando o analisador encontra-lo. Isso é mais rápido e salva na memória. Você paga para que com não ser capaz de usar XPath.

Pessoalmente, acho simplexml bastante limitante (daí simples) no que ela oferece mais de DOM. Você pode alternar entre DOM e SimpleXML facilmente embora, mas eu normalmente não incomodar e ir a rota DOM diretamente. DOM é uma implementação da API W3C DOM, de modo que você pode estar familiarizado com ele de outras línguas, por exemplo JavaScript.

Esta é uma função útil para análise XML rápido e fácil quando um ramal não está disponível:

<?php
/**
 * Convert XML to an Array
 *
 * @param string  $XML
 * @return array
 */
function XMLtoArray($XML)
{
    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $XML, $vals);
    xml_parser_free($xml_parser);
    // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
    $_tmp='';
    foreach ($vals as $xml_elem) {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_level!=1 && $x_type == 'close') {
            if (isset($multi_key[$x_tag][$x_level]))
                $multi_key[$x_tag][$x_level]=1;
            else
                $multi_key[$x_tag][$x_level]=0;
        }
        if ($x_level!=1 && $x_type == 'complete') {
            if ($_tmp==$x_tag)
                $multi_key[$x_tag][$x_level]=1;
            $_tmp=$x_tag;
        }
    }
    // jedziemy po tablicy
    foreach ($vals as $xml_elem) {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_type == 'open')
            $level[$x_level] = $x_tag;
        $start_level = 1;
        $php_stmt = '$xml_array';
        if ($x_type=='close' && $x_level!=1)
            $multi_key[$x_tag][$x_level]++;
        while ($start_level < $x_level) {
            $php_stmt .= '[$level['.$start_level.']]';
            if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
                $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
            $start_level++;
        }
        $add='';
        if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) {
            if (!isset($multi_key2[$x_tag][$x_level]))
                $multi_key2[$x_tag][$x_level]=0;
            else
                $multi_key2[$x_tag][$x_level]++;
            $add='['.$multi_key2[$x_tag][$x_level].']';
        }
        if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) {
            if ($x_type == 'open')
                $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
            else
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
            eval($php_stmt_main);
        }
        if (array_key_exists('attributes', $xml_elem)) {
            if (isset($xml_elem['value'])) {
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
                eval($php_stmt_main);
            }
            foreach ($xml_elem['attributes'] as $key=>$value) {
                $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
                eval($php_stmt_att);
            }
        }
    }
    return $xml_array;
}
?>

Oi Eu acho que o SimpleXML é muito útil. E com ele eu estou usando xpath ;

$xml = simplexml_load_file("som_xml.xml");

$blocks  = $xml->xpath('//block'); //gets all <block/> tags
$blocks2 = $xml->xpath('//layout/block'); //gets all <block/> which parent are   <layout/>  tags

Eu uso muitas configurações XML e isso me ajuda a analisá-los muito rápido. SimpleXml está escrito na C por isso é muito rápido.

Depende do que você está tentando fazer com os arquivos XML. Se você está apenas tentando ler o arquivo XML (como um arquivo de configuração), The Wicked Flea está correto em sugerir SimpleXML uma vez que cria o que equivale a ArrayObjects aninhadas. por exemplo. valor será acessível por $ XML-> raiz-> criança.

Se você estiver olhando para manipular os arquivos XML que você está provavelmente melhor fora de usar DOM XML

o analisador crxml é uma verdadeira fácil de analisador.

Esta classe tem uma função de pesquisa, que leva um nome de nó com qualquer namespace como um argumento. Ele procura o xml para o nó e imprime a declaração de acesso para acessar esse nó usando esta classe. Esta classe também faz geração xml muito fácil.

Você pode baixar esta classe em

http://freshmeat.net/projects/crxml

ou a partir phpclasses.org

http: //www.phpclasses. org / pacote / 6769-PHP-Manipular-XML-documentos-as-array.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top