【问题标题】:What to use for XML parsing / reading in PHP4在 PHP4 中用于 XML 解析/读取的内容
【发布时间】:2010-09-13 00:46:36
【问题描述】:

不幸的是,我必须在 PHP4 服务器上使用较旧的 Web 应用程序; 它现在需要解析大量的XML 来调用webservices (custom protocol, no SOAP/REST)

PHP5 下,我会使用SimpleXML,但这不可用; 在PHP4 中有Dom XML,但在PHP5 中不再是默认值。

还有哪些其他选择? 我正在寻找一种在 PHP5 迁移后仍然有效的解决方案。

如果XML 可以使用架构进行验证,那将是一个很好的补充。

【问题讨论】:

    标签: php xml web-services


    【解决方案1】:

    有一个 simpleXML backport 可用:http://www.ister.org/code/simplexml44/index.html

    如果你可以安装它,那将是最好的解决方案。

    【讨论】:

      【解决方案2】:

      关于 simpleXML 反向移植,我会支持 Rich Bradshaw's suggestion,但如果这不是一个选项,那么 xml_parse 将在 PHP4 中完成这项工作,并且在迁移到 5 后仍然可以工作。

      $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 关于在 PHP4 中解析 XML 可能对您有些用处。

      【讨论】:

        【解决方案3】:

        这可能有点草根,但如果它适用于您正在处理的数据,您可以使用 XSLT 将您的 XML 转换为可用的东西。显然,一旦您升级到 PHP5,XSLT 仍然可以工作,您可以随时迁移到 DOM 解析。

        安德鲁

        【讨论】:

          【解决方案4】:

          如果你可以使用 xml_parse,那就去吧。它健壮、快速并且与 PHP5 兼容。然而,它不是一个 DOM 解析器,而是一个更简单的基于事件的解析器 (Also called a SAX parser),因此如果您需要访问一棵树,您必须自己将流编组为一棵树。这很容易做到;使用 s 堆栈,并在 start-element 上将项目推送到它并在 end-element 上弹出。

          【讨论】:

            【解决方案5】:

            我肯定会推荐 SimpleXML 反向移植,只要它的性能足以满足您的需要。 xml_parse 的演示看起来很简单,但根据我的经验,它很快就会变得非常麻烦。内容处理程序函数不会获取有关解析器在树中位置的任何上下文信息,除非您跟踪它并在开始和结束标记处理程序中提供它。所以你要么为每个开始/结束标签调用函数,要么抛出全局变量来跟踪你在树中的位置。

            很明显,SimpleXML backport 会慢一些,因为它是用 PHP 编写的,并且必须在可用之前解析整个文档,但编码的简单性远远弥补了这一点。

            【讨论】:

              【解决方案6】:

              也许还可以考虑查看 PEAR 中可用的 XML 包,特别是 XML_UtilXML_ParserXML_Serializer...

              【讨论】:

                【解决方案7】:

                带有 parse_into_struct 的 XML Parser 变成了树数组结构:

                <?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]);
                

                输出:

                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
                                                                        )
                
                                                                )
                                                    ...
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-06-23
                  • 2014-11-26
                  • 2023-03-15
                  • 1970-01-01
                  • 2012-03-01
                  相关资源
                  最近更新 更多