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 '}'

simplexml44

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

PHP4の他の代替手段はsimplexml_file_load()ありnew simpleXMLelementますか?

この特定のケースでは、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 は自分で解析するのが非常に簡単です。とにかく、php 4 にはxml_parseがあり、 domxml_open_file

ここにphp4のjson別のjsonがあります

xmlの解析によると:

XMLは厳密な形式であるため、xmlファイルの構造を知っていれば、RegExpを使用することもできます(つまり、すべてのタグを閉じ、すべての属性を引用符で囲み、すべての特殊記号を常にエスケープする必要があります)

任意の 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

ArrayAccessPHP4 は、必要な をサポートしておらず、その__get()機能を模倣したオブジェクトを作成することを効果的に防止する魔法のメソッドも持っていません。__set()__toString()SimpleXMLElement

また、OOP-object-model とガベージ コレクションの制限があるため、Simplexml によって行われるインメモリ構造を自分で作成することは、PHP 4 ではうまくいきません。特に、ここではFlyweightパターンのようなものを好むので.

つまり、イベントまたはプル ベースの XML パーサーを探しているということです。

PHP で XML を解析するための PHP 4 の方法であるXML パーサー関数を見てください。何年も前のPHPトレーニング資料で、例とそうでないものも含めてよく説明されています。

于 2013-10-31T15:53:28.307 に答える