PHP XML ayrıştırma ve dönüşüm?

3 Cevap php

Ben sayfada XML öğeleri değerlendirerek sayfadaki öğeleri koyar sayfa ekranı için tanımlanan özel bir XML şema var. Bu, şu anda preg düzenli ifade işlevleri esas olarak çok iyi preg_replace_callback fonksiyonu, örneğin, kullanılarak gerçekleştirilir:

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

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

Sadece bir örnek olarak.

Şimdi bu kadar uzun XML öğeleri iç içe değil gibi ... oldukça iyi çalışıyor. Eğer varsa böyle bu noktada, bir sürü daha karmaşık alır:

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

Eğer ilk içteki alanını değiştirmek emin olmak istiyorum. Açgözlü / non-açgözlü Şablon akıllıca kullanımı bu daha karmaşık senaryoları işleme bazı yol gidebilirsiniz ama net bir mesaj ben makul yapabilirim Regex ne sınırlarını uzatıyorum ve gerçekten ben XML ayrıştırma yapıyor olması gerektiğidir.

Ne istiyorum ki bir XML dönüşüm paketi:

allows me to conditionally evaluate/include the contained document tree or not based on a callback function ideally (analagous to preg_replace_callback); can handle nested elements of the same or different types; and handles attributes in a nice way (eg as an associative array).

Ne yol boyunca bana yardımcı olabilir?

3 Cevap

PHP'nin XSLTProcessor class (ext/xsl - PHP 5 varsayılan XSL uzantısını içerir ve yapılandırma hattına --with-xsl[=DIR] argüman ekleyerek etkin olabilir) oldukça sofistike ve arasında sağlar diğer şeyler XSLTProcessor::registerPHPFunctions() yöntemini kullanarak XSL belgesinin içinde PHP fonksiyonlarının kullanımı.

Aşağıdaki örnek utanmadan PHP manual page sıkışmak edilir:

$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);

Bunu yapmak için XSL'yi kullanabilirsiniz - sadece ilk iç desen eşleşmesi.

Burada XSL ile neler yapabileceğini öğrenmek için iyi bir başlangıç ​​noktasıdır:

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

Sen xsl dönüşümü sunucu tarafı gerçekleştirmek ya da istemci (js, activex veya diğer kullanarak) yapabilirsiniz.

Hala xsl bu fikri nefret Eğer PHP yerleşik xml ayrıştırma bakmak olabilir - SAX çözümleyici PHP-şu anda libxml2 kullanarak, özel bir çözümleyici oluşturmak için bir geri arama uygulamasıdır için google.

Kesinlikle düzenli ifadeleri değil. Henüz regexplerde önemli şunlardır: XML formatları (XML işleme kütüphaneleri görünmez olan diğer bir deyişle) kendi içeriğini etkisi olmayan yollarla değiştirebilirsiniz. Böyle kod hızlı bir şekilde bakım kabus olur.

Olarak hangi çözümleyici (vb SAX, Stax, DOM, JDom, dom4j, XOM,) kullanmak için,