PHP Tokenizzatore XML più semplice per l'elaborazione delle stringhe?

1

Ho bisogno di fare alcune attività di elaborazione del testo con brevi frammenti XML . La sezione "dettagli" mostra un esempio ... La mia soluzione è usare un tokenizzatore basato su espressioni regolari , ma non è elegante e non usa alcuna funzione di build-in . Le funzioni di build-in candidate (che altri mi indicano) sono strtok e SimpleXML

Quindi, la mia domanda ha due parti:

  1. Le mie ipotesi sono corrette? Non ci sono altri "candidati", solo strtok e SimpleXML? È corretto ritenere DomDocument un "elefante" (con un grande sovraccarico della CPU) per una semplice attività di elaborazione del testo ?

  2. Come utilizzare SimpleXML per svolgere la stessa attività (illustrata)? PS: non ho bisogno di tutti gli algoritmi o implementazione, solo alcuni indizi.

Dettagli

PHP offre un tokenizer, strtok , molto semplice, e non vedo come usarlo con Stringa XML. L'opzione SimpleXML , è forse pesante per attività come '' elaborazione del testo '' (vedi questo esempio e il sotto), ed è più di un tokenizer.

Che cosa voglio dire esattamente con "tokenizer" e "text processing"? Vedi l'esempio qui sotto. Ho usato un "parser regex", ma vorrei un algoritmo basato su alcune funzioni incorporate come SimpleXML, se è più semplice e veloce .

 $xmlFrag = '
   <p align="center">&nbsp; Hello world!</p> 
   <p class="test"><i>&nbsp; Beautiful</i> day today.</p>';

 // TOKENIZING TAGS AND ENTITIES:
 $reg=array();
 $xmlFrag = preg_replace_callback(
    '/<!\-\-.+?\-\->|<.+?>|&[a-z0-9]+;/is', 
    function ($m) {
        global $reg; $reg[]=$m[0]; $n=count($reg)-1;
        return "##$n#";
    },
    $xmlFrag
 );
 echo $xmlFrag;     // results:
 //  ##0###1# Hello world!##2#  ##3###4###5# Beautiful##6# day today.##7#

 // PROCESS THE TEXT: any, in one step. Example: lower, upper, change orthography, etc.
 $xmlFrag = strtoupper($xmlFrag);
 echo $xmlFrag;
 //  ##0###1# HELLO WORLD!##2#  ##3###4###5# BEAUTIFUL##6# DAY TODAY.##7#

 // EXPAND TOKENS:
 $xmlFrag = preg_replace_callback(
    '/##([0-9]+)#/is', 
    function ($m) { global $reg; return $reg[$m[1]]; },
    $xmlFrag
 );
 echo $xmlFrag;
 //  <p align="center">  HELLO WORLD!</p> 
 //  <p class="test"><i>  BEAUTIFUL</i> DAY TODAY.</p>

Uso di SimpleXML

Come implementare un algoritmo SimpleXML per risolvere il problema illustrato (codice sopra)? PROBLEMI:

  • Carica un XML con entità denominate (come &nbsp; nell'esempio).
  • Attraversa l'XML per ottenere solo nodi di testo. Con $sx->xpath('//text()'); non posso modificare i nodi.

Utilizzo di DomDocument

È fuori dal contesto, perché i miei frammenti XML sono brevi e DomDocument impone un grande sovraccarico di CPU (? è questo un preconcetto?) per la semplice elaborazione del testo.

    
posta Peter Krauss 12.07.2013 - 04:27
fonte

1 risposta

2

Scusa, trovo (!) e ho un'idea sbagliata di DomDocument (non è un "elefante"):

  1. DomDocument ha prestazioni (volte) paragonabili a SimpleXML.

  2. Ci sono un semplice algoritmo per risolvere il mio problema!

     $dom = new DOMDocument;
     $dom->loadXML($xmlFrag);  
     $xpath = new DOMXpath($dom);
     $elements = $xpath->query("//text()");
     foreach ($elements as $element) // loop for text processing:
         $element->nodeValue = strtoupper($element->nodeValue);
     print $dom->saveXML();
    

Prestazioni (tempi di esecuzione per un ciclo 10000):

risposta data 12.07.2013 - 21:21
fonte

Leggi altre domande sui tag