0

我正在使用旧版本的 PHP (4.3.9) 在服务器上进行开发,并且正在尝试将 XML 字符串转换为 JSON 字符串。这在 PHP5 中很容易,但在 PHP4 中要困难得多。

我试过了:

Zend JSON.php

require_once 'Zend/Json.php';
echo Zend_Json::encode($sxml);

错误:
PHP Parse error: parse error, unexpected T_CONST, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'

简单的xml44

$impl = new IsterXmlSimpleXMLImpl;
$NDFDxmltemp = $impl->load_file($NDFDstring);
$NDFDxml = $NDFDxmltemp->asXML();

错误:
WARNING isterxmlexpatnonvalid->parse(): nothing to read

xml_parse

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "_start_element", "_end_element");
xml_set_character_data_handler($xml_parser, "_character_data");  
xml_parse($xml_parser, $NDFDstring);

错误:
PHP Warning: xml_parse(): Unable to call handler _character_data() in ...
PHP Warning: xml_parse(): Unable to call handler _end_element() in ...

有没有人有任何其他替代PHP4simplexml_file_load()new simpleXMLelement在 PHP4 中?

在这种特殊情况下,升级 PHP 不是一个选项,所以不要费心提出它。是的,我知道它很旧。

注意:这是我试图解析为多维数组或 json 的 XML。 http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?lat=40&lon=-120&product=time-series&begin=2013-10-30T00:00:00&end=2013-11-06T00:00:00&maxt =maxt&mint=mint&rh=rh&wx=wx&wspd=wspd&wdir=wdir&icons=icons&wgust=wgust&pop12=pop12&maxrh=maxrh&minrh=minrh&qpf=qpf&snow=snow&temp=temp&wwa=wwa

4

2 回答 2

2

XML 很容易自己解析,无论如何这里存在xml_parse在 php 4 和domxml_open_file

这是php4 的 json另一个

根据解析xml:

如果你知道 xml 文件的结构,你甚至可以使用 RegExp,因为 XML 是严格格式(我的意思是所有标签都必须关闭,所有属性都用引号括起来,所有特殊符号总是转义)

如果您解析任意 xml 文件,这里是学生示例,它适用于 php4,不了解所有 XML 功能,但可以给您“蛮力”之类的想法:

<?php
    define("LWG_XML_ELEMENT_NULL", "0");
    define("LWG_XML_ELEMENT_NODE", "1");

    function EntitiesToString($str)
    {
        $s = $str;

        $s = eregi_replace("&quot;", "\"", $s);
        $s = eregi_replace("&lt;", "<", $s);
        $s = eregi_replace("&gt;", ">", $s);
        $s = eregi_replace("&amp;", "&", $s);

        return $s;
    }

    class CLWG_dom_attribute
    {
        var $name;
        var $value;

        function CLWG_dom_attribute()
        {
            $name = "";
            $value = "";
        }
    }

    class CLWG_dom_node
    {
        var $m_Attributes;
        var $m_Childs;

        var $m_nAttributesCount;
        var $m_nChildsCount;

        var $type;
        var $tagname;
        var $content;

        function CLWG_dom_node()
        {
            $this->m_Attributes = array();
            $this->m_Childs = array();

            $this->m_nAttributesCount = 0;
            $this->m_nChildsCount = 0;

            $this->type = LWG_XML_ELEMENT_NULL;
            $this->tagname = "";
            $this->content = "";
        }

        function get_attribute($attr_name)
        {
            //echo "<message>Get Attribute: ".$attr_name." ";
            for ($i=0; $i<sizeof($this->m_Attributes); $i++)
                if ($this->m_Attributes[$i]->name == $attr_name)
                {
                    //echo $this->m_Attributes[$i]->value . "</message>\n";
                    return $this->m_Attributes[$i]->value;
                }
            //echo "[empty]</message>\n";
            return "";
        }
        function get_content()
        {
            //echo "<message>Get Content: ".$this->content . "</message>\n";
            return $this->content;
        }

        function attributes()
        {
            return $this->m_Attributes;
        }
        function child_nodes()
        {
            return $this->m_Childs;
        }

        function loadXML($str, &$i)
        {
            //echo "<debug>DEBUG: LoadXML (".$i.": ".$str[$i].")</debug>\n";
            $str_len = strlen($str);

            //echo "<debug>DEBUG: start searching for tag (".$i.": ".$str[$i].")</debug>\n";
            while ( ($i<$str_len) && ($str[$i] != "<") )
                $i++;
            if ($i == $str_len) return FALSE;
            $i++;

            while ( ($i<strlen($str)) && ($str[$i] != " ") && ($str[$i] != "/") && ($str[$i] != ">") )
                $this->tagname .= $str[$i++];

            //echo "<debug>DEBUG: Tag: " . $this->tagname . "</debug>\n";

            if ($i == $str_len) return FALSE;
            switch ($str[$i])
            {
                case " ": // attributes comming
                {
                    //echo "<debug>DEBUG: Tag: start searching attributes</debug>\n";
                    $i++;
                    $cnt = sizeof($this->m_Attributes);
                    while ( ($i<strlen($str)) && ($str[$i] != "/") && ($str[$i] != ">") )
                    {
                        $this->m_Attributes[$cnt] = new CLWG_dom_attribute;
                        while ( ($i<strlen($str)) && ($str[$i] != "=") )
                            $this->m_Attributes[$cnt]->name .= $str[$i++];
                        if ($i == $str_len) return FALSE;
                        $i++;
                        while ( ($i<strlen($str)) && ($str[$i] != "\"") )
                            $i++;
                        if ($i == $str_len) return FALSE;
                        $i++;
                        while ( ($i<strlen($str)) && ($str[$i] != "\"") )
                            $this->m_Attributes[$cnt]->value .= $str[$i++];

                        $this->m_Attributes[$cnt]->value = EntitiesToString($this->m_Attributes[$cnt]->value);

                        //echo "<debug>DEBUG: Tag: Attribute: '".$this->m_Attributes[$cnt]->name."' = '".$this->m_Attributes[$cnt]->value."'</debug>\n";

                        if ($i == $str_len) return FALSE;
                        $i++;
                        if ($i == $str_len) return FALSE;
                        while ( ($i<strlen($str)) && ($str[$i] == " ") )
                            $i++;

                        $cnt++;
                    }
                    if ($i == $str_len) return FALSE;
                    switch ($str[$i])
                    {
                        case "/":
                        {
                            //echo "<debug>DEBUG: self closing tag with attributes (".$this->tagname.")</debug>\n";
                            $i++;
                            if ($i == $str_len) return FALSE;
                            if ($str[$i] != ">") return FALSE;
                            $i++;
                            return TRUE;
                            break;
                        }
                        case ">";
                        {
                            //echo "<debug>DEBUG: end of attributes (".$this->tagname.")</debug>\n";
                            $i++;
                            break;
                        }
                    }
                    break;
                }
                case "/": // self closing tag
                {
                    //echo "<debug>DEBUG: self closing tag (".$this->tagname.")</debug>\n";
                    $i++;
                    if ($i == $str_len) return FALSE;
                    if ($str[$i] != ">") return FALSE;
                    $i++;
                    return TRUE;
                    break;
                }
                case ">": // end of begin of node
                {
                    //echo "<debug>DEBUG: end of begin of node</debug>\n";
                    $i++;
                    break;
                }
            }
            if ($i == $str_len) return FALSE;

            $b = 1;

            while ( ($i<$str_len) && ($b) )
            {
                //echo "<debug>DEBUG: searching for content</debug>\n";
                while ( ($i<strlen($str)) && ($str[$i] != "<") )
                    $this->content .= $str[$i++];
                //echo "<debug>DEBUG: content: ".$this->content."</debug>\n";
                if ($i == $str_len) return FALSE;
                $i++;
                if ($i == $str_len) return FALSE;
                if ($str[$i] != "/") // new child
                {
                    $cnt = sizeof($this->m_Childs);
                    //echo "<debug>DEBUG: Create new child (" . $cnt . ")</debug>\n";

                    $this->m_Childs[$cnt] = new CLWG_dom_node;
                    $this->m_Childs[$cnt]->type = LWG_XML_ELEMENT_NODE;
                    $i--;
                    if ($this->m_Childs[$cnt]->loadXML($str, $i) === FALSE)
                        return FALSE;
                }
                else
                    $b = 0;
            }

            $i++;
            $close_tag = "";
            while ( ($i<strlen($str)) && ($str[$i] != ">") )
                $close_tag .= $str[$i++];
            //echo "<debug>DEBUG: close tag: ".$close_tag." - ".$this->tagname."</debug>\n";
            if ($i == $str_len) return FALSE;
            $i++;

            $this->content = EntitiesToString($this->content);
            //echo "<debug>DEBUG: content: ".$this->content."</debug>\n";

            return ($close_tag == $this->tagname);
        }
    }

    class CLWG_dom_xml
    {
        var $m_Root;

        function CLWG_dom_xml()
        {
            $this->m_Root = 0;
        }

        function document_element()
        {
            return $this->m_Root;
        }

        function loadXML($xml_string)
        {
            // check xml tag
            if (eregi("<\\?xml", $xml_string))
            {
                // check xml version
                $xml_version = array();
                if ( (eregi("<\\?xml version=\"([0-9\\.]+)\".*\\?>", $xml_string, $xml_version)) && ($xml_version[1] == 1.0) )
                {
                    // initialize root
                    $this->m_Root = new CLWG_dom_node;
                    $i = 0;
                    return $this->m_Root->loadXML(eregi_replace("<\\?xml.*\\?>", "", $xml_string), $i);
                }
                else
                {
                    echo "<error>Cannot find version attribute in xml tag</error>";
                    return FALSE;
                }
            }
            else
            {
                echo "<error>Cannot find xml tag</error>";
                return FALSE;
            }
        }
    }

    function lwg_domxml_open_mem($xml_string)
    {
        global $lwg_xml;
        $lwg_xml = new CLWG_dom_xml;

        if ($lwg_xml->loadXML($xml_string))
            return $lwg_xml;
        else
            return 0;
    }
?>
于 2013-10-30T20:52:25.460 回答
1

PHP4 不支持ArrayAccess也没有所需__get()的魔法方法__set()__toString()这些方法有效地阻止您创建模仿SimpleXMLElement.

我还要说自己创建一个由 Simplexml 完成的内存结构在 PHP 4 中效果不佳,因为它受到 OOP 对象模型和垃圾收集的限制。特别是因为我更喜欢这里的Flyweight模式。

这使我想到您可能更多地寻找事件或基于拉的 XML 解析器。

看看XML Parser Functions,它们是 PHP 4 用 PHP 解析 XML 的方法。你会发现它在多年前的 PHP 培训材料中得到了很好的解释,还附有示例和其他内容。

于 2013-10-31T15:53:28.307 回答