2008-11-29 13 views
0

J'ai un schéma XML personnalisé défini pour l'affichage de la page qui met des éléments sur la page en évaluant les éléments XML sur la page. Ceci est actuellement mis en œuvre en utilisant les fonctions preg, regex principalement l'excellente fonction preg_replace_callback, par exemple:Analyse et transformation XML en PHP?

... 
$s = preg_replace_callback("!<field>(.*?)</field>!", replace_field, $s); 
... 

function replace_field($groups) { 
    return isset($fields[$group[1]) ? $fields[$groups[1]] : ""; 
} 

À titre d'exemple.

Maintenant cela fonctionne plutôt bien ... tant que les éléments XML ne sont pas imbriqués. A ce stade, il se complique beaucoup, comme si vous avez:

<field name="outer"> 
    <field name="inner"> 
    ... 
    </field> 
</field> 

Vous voulez vous assurer que vous remplacez le champ le plus intérieur en premier. L'utilisation judicieuse de modèles regex gourmands/non gourmands peut être un moyen de gérer ces scénarios plus compliqués, mais le message clair est que j'atteins les limites de ce que regex peut raisonnablement faire et que j'ai vraiment besoin d'analyser XML.

Ce que je voudrais est un ensemble de transformation XML:

me permet de déterminer de manière conditionnelle/inclure l'arborescence des documents contenus ou non basé sur une fonction de rappel idéal (à preg_replace_callback analogue); peut gérer des éléments imbriqués de types identiques ou différents; et gère les attributs d'une manière agréable (par exemple en tant que tableau associatif).

Qu'est-ce qui peut m'aider en cours de route?

Répondre

3

classe PHP XSLTProcessor (ext/xsl - PHP 5 inclut l'extension XSL par défaut et peut être activée en ajoutant l'argument --with-xsl[=DIR] à votre ligne de configuration) est assez sophistiqué et permet entre autres l'utilisation des fonctions PHP dans votre document XSL par en utilisant la méthode XSLTProcessor::registerPHPFunctions().

L'exemple suivant est sans vergogne pincé du PHP manual page:

$xml = '<allusers> 
<user> 
    <uid>bob</uid> 
</user> 
<user> 
    <uid>joe</uid> 
</user> 
</allusers>'; 
$xsl = '<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:php="http://php.net/xsl"> 
<xsl:output method="html" encoding="utf-8" indent="yes"/> 
<xsl:template match="allusers"> 
    <html><body> 
    <h2>Users</h2> 
    <table> 
    <xsl:for-each select="user"> 
     <tr><td> 
     <xsl:value-of 
      select="php:function(\'ucfirst\',string(uid))"/> 
     </td></tr> 
    </xsl:for-each> 
    </table> 
    </body></html> 
</xsl:template> 
</xsl:stylesheet>'; 
$xmldoc = DOMDocument::loadXML($xml); 
$xsldoc = DOMDocument::loadXML($xsl); 

$proc = new XSLTProcessor(); 
$proc->registerPHPFunctions(); 
$proc->importStyleSheet($xsldoc); 
echo $proc->transformToXML($xmldoc); 
3

Vous pouvez utiliser XSL pour cela: il suffit de faire correspondre les motifs internes en premier.

est ici un bon point de départ pour apprendre ce que vous pouvez faire avec XSL:

http://www.w3schools.com/xsl/

Vous pouvez effectuer le côté serveur de transformation xsl ou dans le client (en utilisant js, activex ou autre). Si vous toujours détesté cette idée de xsl, vous pouvez regarder l'analyse xml intégrée dans PHP - google pour SAX parser PHP - qui est une implémentation de callback pour construire votre analyseur personnalisé, en utilisant actuellement libxml2.

+0

Oui, je suis au courant de XSL. Je l'ai fait beaucoup en 2002/2003 et je l'ai trouvé vraiment méchant. Est-ce que PHP autorise les transformations XSL avec des rappels appropriés? – cletus

+0

Oui, vous pouvez pratiquement faire n'importe quoi dans PHP que vous pouvez faire avec du vieux libxml2.La réponse suivante a des détails pour l'enregistrement des fonctions PHP pour une utilisation dans xsl – Klathzazt

0

Certainement pas regexps. Les formats XML peuvent changer de manière à ne pas affecter leur contenu (en d'autres termes: ils sont invisibles aux bibliothèques de gestion XML), mais ils sont importants pour les expressions rationnelles. Un tel code devient rapidement un cauchemar de maintenance.

Comme à laquelle l'analyseur à utiliser (SAX, Stax, DOM, JDOM, dom4j, XOM, etc.),