Ne PHP4 XML ayrıştırma / okuma için kullanılacak

7 Cevap php

Unfortunatly I have to work in a older web application on a PHP4 server; It now needs to parse a lot of XML for calling webservices (custom protocol, no SOAP/REST);

Under PHP5 I would use SimpleXML but that isn't available; There is Dom XML in PHP4, but it isn't default any more in PHP5.

What are the other options? I'm looking for a solution that still works on PHP5 once they migrate.

XML şema ile doğrulanmış olabilir eğer güzel bir ekstra olur.

7 Cevap

Bir SimpleXMLElement backport DAİREMİZ vardır: http://www.ister.org/code/simplexml44/index.html

Bunu yüklemek, o en iyi çözüm olacaktır.

Bu bir seçenek değil, ben ikinci Rich Bradshaw's suggestion SimpleXML backport hakkında, ancak, daha sonra xml_parse PHP4'te işi yapmak, ve hala 5 göç sonra çalışır olacaktır olacaktır.

$xml = ...; // Get your XML data
$xml_parser = xml_parser_create();

// _start_element and _end_element are two functions that determine what
// to do when opening and closing tags are found
xml_set_element_handler($xml_parser, "_start_element", "_end_element");

// How to handle each char (stripping whitespace if needs be, etc
xml_set_character_data_handler($xml_parser, "_character_data");  

xml_parse($xml_parser, $xml);

tutorial here size bazı kullanım olabilir PHP4'te XML ayrıştırma hakkında iyi var.

Biraz ot kökleri olabilir, ama çalıştığınız veriler için geçerli eğer, kullanılabilir bir şey sizin XML dönüştürmek için XSLT kullanabilirsiniz. Açıkçası PHP5 yükseltme kez XSLT çalışmaya devam eder ve gibi ve ne zaman DOM ayrıştırma size geçirebilirsiniz.

Andrew

Eğer xml_parse kullanabilirsiniz, o zaman bunun için gidin. Bu sağlam, hızlı ve PHP5 ile uyumlu. Ancak bir DOM ayrıştırıcı değil, basit bir olay tabanlı bir (Also called a SAX parser), böylece bir ağaç erişmek için gerekiyorsa, bir ağaca kendini içine akışı sıralamakta olacaktır. Bu yapmak oldukça basittir; Kullan s yığını, ve start-element üzerine kendisine öğeleri itmek ve end-element pop.

Ben kesinlikle sürece performans ihtiyaçlarınız için yeterince iyi olduğu gibi, SimpleXML backport öneriyoruz. Xml_parse ve gösteriler yeteri kadar basit görünebilir, ama benim deneyim çok hızlı bir şekilde çok kıllı alabilirsiniz. Bunu izlemek ve başlangıç ​​ve bitiş etiketi işleyicilerdeki bunu sağlamak sürece içerik işleyici işlevleri, ayrıştırıcı ağacında olduğu hakkında herhangi bir bağlamsal bilgi alamadım. Yani ya her başlangıç ​​/ bitiş etiketi işlevleri çağırmak, veya ağaç nerede izlemek için global değişkenler etrafında atıyorlar.

Açıkçası PHP ile yazılmış ve o kullanılabilir önce bütün belgeyi ayrıştırmak zorunda bulunuyor gibi SimpleXML backport, biraz daha yavaş olacaktır, ancak daha fazla kodlama kolaylığı için yapar.

Belki de PEAR, özellikle * XML_Util *, * xml_parser * mevcut XML paketleri bakarak düşünün, ve * XML_Serializer * ...

Parse_into_struct XML Ayrıştırıcı bir ağaç-dizi yapıya dönüştü:

<?php
/**
 * What to use for XML parsing / reading in PHP4
 * @link http://stackoverflow.com/q/132233/367456
 */

$encoding = 'US-ASCII';
         // https://gist.github.com/hakre/46386de578619fbd898c
$path     = dirname(__FILE__) . '/time-series-example.xml';

$parser_creator = 'xml_parser_create'; // alternative creator is 'xml_parser_create_ns'

if (!function_exists($parser_creator)) {
    trigger_error(
        "XML Parsers' $parser_creator() not found. XML Parser "
        . '<http://php.net/xml> is required, activate it in your PHP configuration.'
        , E_USER_ERROR
    );
    return;
}

$parser = $parser_creator($encoding);
if (!$parser) {
    trigger_error(sprintf('Unable to create a parser (Encoding: "%s")', $encoding), E_USER_ERROR);
    return;
}

xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

$data = file_get_contents($path);
if ($data === FALSE) {
    trigger_error(sprintf('Unable to open file "%s" for reading', $path));
    return;
}
$result = xml_parse_into_struct($parser, $data, $xml_struct_values);
unset($data);
xml_parser_free($parser);
unset($parser);

if ($result === 0) {
    trigger_error(sprintf('Unable to parse data of file "%s" as XML', $path));
    return;
}

define('TREE_NODE_TAG', 'tagName');
define('TREE_NODE_ATTRIBUTES', 'attributes');
define('TREE_NODE_CHILDREN', 'children');

define('TREE_NODE_TYPE_TAG', 'array');
define('TREE_NODE_TYPE_TEXT', 'string');
define('TREE_NODE_TYPE_NONE', 'NULL');

/**
 * XML Parser indezies for parse into struct values
 */
define('XML_STRUCT_VALUE_TYPE', 'type');
define('XML_STRUCT_VALUE_LEVEL', 'level');
define('XML_STRUCT_VALUE_TAG', 'tag');
define('XML_STRUCT_VALUE_ATTRIBUTES', 'attributes');
define('XML_STRUCT_VALUE_VALUE', 'value');

/**
 * XML Parser supported node types
 */
define('XML_STRUCT_TYPE_OPEN', 'open');
define('XML_STRUCT_TYPE_COMPLETE', 'complete');
define('XML_STRUCT_TYPE_CDATA', 'cdata');
define('XML_STRUCT_TYPE_CLOSE', 'close');

/**
 * Tree Creator
 * @return array
 */
function tree_create()
{
    return array(
        array(
            TREE_NODE_TAG        => NULL,
            TREE_NODE_ATTRIBUTES => NULL,
            TREE_NODE_CHILDREN   => array(),
        )
    );
}

/**
 * Add Tree Node into Tree a Level
 *
 * @param $tree
 * @param $level
 * @param $node
 * @return array|bool Tree with the Node added or FALSE on error
 */
function tree_add_node($tree, $level, $node)
{
    $type = gettype($node);
    switch ($type) {
        case TREE_NODE_TYPE_TEXT:
            $level++;
            break;
        case TREE_NODE_TYPE_TAG:
            break;
        case TREE_NODE_TYPE_NONE:
            trigger_error(sprintf('Can not add Tree Node of type None, keeping tree unchanged', $type, E_USER_NOTICE));
            return $tree;
        default:
            trigger_error(sprintf('Can not add Tree Node of type "%s"', $type), E_USER_ERROR);
            return FALSE;
    }

    if (!isset($tree[$level - 1])) {
        trigger_error("There is no parent for level $level");
        return FALSE;
    }

    $parent = & $tree[$level - 1];

    if (isset($parent[TREE_NODE_CHILDREN]) && !is_array($parent[TREE_NODE_CHILDREN])) {
        trigger_error("There are no children in parent for level $level");
        return FALSE;
    }

    $parent[TREE_NODE_CHILDREN][] = & $node;
    $tree[$level]                 = & $node;

    return $tree;
}

/**
 * Creator of a Tree Node
 *
 * @param $value XML Node
 * @return array Tree Node
 */
function tree_node_create_from_xml_struct_value($value)
{
    static $xml_node_default_types = array(
        XML_STRUCT_VALUE_ATTRIBUTES => NULL,
        XML_STRUCT_VALUE_VALUE      => NULL,
    );

    $orig = $value;

    $value += $xml_node_default_types;

    switch ($value[XML_STRUCT_VALUE_TYPE]) {
        case XML_STRUCT_TYPE_OPEN:
        case XML_STRUCT_TYPE_COMPLETE:
            $node = array(
                TREE_NODE_TAG => $value[XML_STRUCT_VALUE_TAG],
                // '__debug1' => $orig,
            );
            if (isset($value[XML_STRUCT_VALUE_ATTRIBUTES])) {
                $node[TREE_NODE_ATTRIBUTES] = $value[XML_STRUCT_VALUE_ATTRIBUTES];
            }
            if (isset($value[XML_STRUCT_VALUE_VALUE])) {
                $node[TREE_NODE_CHILDREN] = (array)$value[XML_STRUCT_VALUE_VALUE];
            }
            return $node;

        case XML_STRUCT_TYPE_CDATA:
            // TREE_NODE_TYPE_TEXT
            return $value[XML_STRUCT_VALUE_VALUE];

        case XML_STRUCT_TYPE_CLOSE:
            return NULL;

        default:
            trigger_error(
                sprintf(
                    'Unkonwn Xml Node Type "%s": %s', $value[XML_STRUCT_VALUE_TYPE], var_export($value, TRUE)
                )
            );
            return FALSE;
    }
}

$tree = tree_create();

while ($tree && $value = array_shift($xml_struct_values)) {
    $node = tree_node_create_from_xml_struct_value($value);
    if (NULL === $node) {
        continue;
    }
    $tree = tree_add_node($tree, $value[XML_STRUCT_VALUE_LEVEL], $node);
    unset($node);
}

if (!$tree) {
    trigger_error('Parse error');
    return;
}

if ($xml_struct_values) {
    trigger_error(sprintf('Unable to process whole parsed XML array (%d elements left)', count($xml_struct_values)));
    return;
}

// tree root is the first child of level 0
print_r($tree[0][TREE_NODE_CHILDREN][0]);

Çıktı:

Array
(
    [tagName] => dwml
    [attributes] => Array
        (
            [version] => 1.0
            [xmlns:xsd] => http://www.w3.org/2001/XMLSchema
            [xmlns:xsi] => http://www.w3.org/2001/XMLSchema-instance
            [xsi:noNamespaceSchemaLocation] => http://www.nws.noaa.gov/forecasts/xml/DWMLgen/schema/DWML.xsd
        )

    [children] => Array
        (
            [0] => Array
                (
                    [tagName] => head
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [tagName] => product
                                    [attributes] => Array
                                        (
                                            [srsName] => WGS 1984
                                            [concise-name] => time-series
                                            [operational-mode] => official
                                        )

                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [tagName] => title
                                                    [children] => Array
                                                        (
                                                            [0] => NOAA's National Weather Service Forecast Data
                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [tagName] => field
                                                    [children] => Array
                                                        (
                                                            [0] => meteorological
                                                        )

                                                )

                                            [2] => Array
                                                (
                                                    [tagName] => category
                                                    [children] => Array
                                                        (
                                                            [0] => forecast
                                                        )

                                                )

                                            [3] => Array
                                                (
                                                    [tagName] => creation-date
                                                    [attributes] => Array
                                                        (
                                                            [refresh-frequency] => PT1H
                                                        )

                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-02T06:51:17Z
                                                        )

                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [tagName] => source
                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [tagName] => more-information
                                                    [children] => Array
                                                        (
                                                            [0] => http://www.nws.noaa.gov/forecasts/xml/
                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [tagName] => production-center
                                                    [children] => Array
                                                        (
                                                            [0] => Meteorological Development Laboratory
                                                            [1] => Array
                                                                (
                                                                    [tagName] => sub-center
                                                                    [children] => Array
                                                                        (
                                                                            [0] => Product Generation Branch
                                                                        )

                                                                )

                                                        )

                                                )

                                            [2] => Array
                                                (
                                                    [tagName] => disclaimer
                                                    [children] => Array
                                                        (
                                                            [0] => http://www.nws.noaa.gov/disclaimer.html
                                                        )

                                                )

                                            [3] => Array
                                                (
                                                    [tagName] => credit
                                                    [children] => Array
                                                        (
                                                            [0] => http://www.weather.gov/
                                                        )

                                                )

                                            [4] => Array
                                                (
                                                    [tagName] => credit-logo
                                                    [children] => Array
                                                        (
                                                            [0] => http://www.weather.gov/images/xml_logo.gif
                                                        )

                                                )

                                            [5] => Array
                                                (
                                                    [tagName] => feedback
                                                    [children] => Array
                                                        (
                                                            [0] => http://www.weather.gov/feedback.php
                                                        )

                                                )

                                        )

                                )

                        )

                )

            [1] => Array
                (
                    [tagName] => data
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [tagName] => location
                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [tagName] => location-key
                                                    [children] => Array
                                                        (
                                                            [0] => point1
                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [tagName] => point
                                                    [attributes] => Array
                                                        (
                                                            [latitude] => 40.00
                                                            [longitude] => -120.00
                                                        )

                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [tagName] => moreWeatherInformation
                                    [attributes] => Array
                                        (
                                            [applicable-location] => point1
                                        )

                                    [children] => Array
                                        (
                                            [0] => http://forecast.weather.gov/MapClick.php?textField1=40.00&textField2=-120.00
                                        )

                                )

                            [2] => Array
                                (
                                    [tagName] => time-layout
                                    [attributes] => Array
                                        (
                                            [time-coordinate] => local
                                            [summarization] => none
                                        )

                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [tagName] => layout-key
                                                    [children] => Array
                                                        (
                                                            [0] => k-p24h-n4-1
                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [tagName] => start-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-02T08:00:00-07:00
                                                        )

                                                )

                                            [2] => Array
                                                (
                                                    [tagName] => end-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-02T20:00:00-07:00
                                                        )

                                                )

                                            [3] => Array
                                                (
                                                    [tagName] => start-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-03T07:00:00-08:00
                                                        )

                                                )

                                            [4] => Array
                                                (
                                                    [tagName] => end-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-03T19:00:00-08:00
                                                        )

                                                )

                                            [5] => Array
                                                (
                                                    [tagName] => start-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-04T07:00:00-08:00
                                                        )

                                                )

                                            [6] => Array
                                                (
                                                    [tagName] => end-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-04T19:00:00-08:00
                                                        )

                                                )

                                            [7] => Array
                                                (
                                                    [tagName] => start-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-05T07:00:00-08:00
                                                        )

                                                )

                                            [8] => Array
                                                (
                                                    [tagName] => end-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-05T19:00:00-08:00
                                                        )

                                                )

                                        )

                                )

                            [3] => Array
                                (
                                    [tagName] => time-layout
                                    [attributes] => Array
                                        (
                                            [time-coordinate] => local
                                            [summarization] => none
                                        )

                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [tagName] => layout-key
                                                    [children] => Array
                                                        (
                                                            [0] => k-p24h-n5-2
                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [tagName] => start-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-01T20:00:00-07:00
                                                        )

                                                )

                                            [2] => Array
                                                (
                                                    [tagName] => end-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-02T09:00:00-07:00
                                                        )

                                                )

                                            [3] => Array
                                                (
                                                    [tagName] => start-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-02T19:00:00-07:00
                                                        )

                                                )

                                            ...

                                            [10] => Array
                                                (
                                                    [tagName] => end-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-06T08:00:00-08:00
                                                        )

                                                )

                                        )

                                )

                            [4] => Array
                                (
                                    [tagName] => time-layout
                                    [attributes] => Array
                                        (
                                            [time-coordinate] => local
                                            [summarization] => none
                                        )

                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [tagName] => layout-key
                                                    [children] => Array
                                                        (
                                                            [0] => k-p12h-n9-3
                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [tagName] => start-valid-time
                                                    [children] => Array
                                                        (
                                                            [0] => 2013-11-01T17:00:00-07:00
                                                        )

                                                )
                                    ...