سؤال

هذا السؤال لديه بالفعل إجابة هنا:

لقد استخدمت XML Parser من قبل، وعلى الرغم من أنه يعمل بشكل جيد، إلا أنني لم أكن سعيدًا به بشكل عام، فقد شعرت أنني كنت أستخدم حلولاً بديلة لأشياء يجب أن تكون وظائف أساسية.

لقد رأيت مؤخرًا SimpleXML ولكني لم أجربه بعد.هل الأمر أبسط؟ما هي المزايا والعيوب لكل منهما؟أي موزعين آخرين استخدمته؟

هل كانت مفيدة؟

المحلول

اود ان اقول SimpleXML يأخذ الكعكة لأنها في البداية امتداد، مكتوبة بلغة C، وهي سريعة جدًا.لكن ثانيًا، تأخذ الوثيقة التي تم تحليلها شكل كائن PHP.حتى تتمكن من "الاستعلام" مثل $root->myElement.

نصائح أخرى

قم بإلقاء نظرة على PHP ملحقات XML المتاحة ونرى http://devzone.zend.com/243/ و http://devzone.zend.com/1035/ لمناقشة تلك.

الفرق الرئيسي بين XML Parser و SimpleXML هو أن الأخير ليس محلل سحب.تم بناء SimpleXML على امتدادات DOM وسيقوم بتحميل ملف XML بأكمله في الذاكرة.سيقوم محلل XML مثل XMLReader بتحميل العقدة الحالية في الذاكرة فقط.يمكنك تحديد معالجات لعقد معينة والتي سيتم تشغيلها عندما يواجهها المحلل اللغوي.وهذا أسرع ويوفر على الذاكرة.أنت تدفع مقابل ذلك مع عدم قدرتك على استخدام XPath.

شخصيًا، أجد أن SimpleXml محدود للغاية (وبالتالي بسيط) فيما يقدمه عبر DOM.يمكنك التبديل بين DOM وSimpleXml بسهولة، لكنني عادةً لا أزعج نفسي وأتبع مسار DOM مباشرة.DOM هو تطبيق لـ W3C DOM API، لذلك قد تكون على دراية به من لغات أخرى، على سبيل المثال JavaScript.

هذه وظيفة مفيدة لتحليل ملف XML السريع والسهل عندما لا يكون الامتداد متاحًا:

<?php
/**
 * Convert XML to an Array
 *
 * @param string  $XML
 * @return array
 */
function XMLtoArray($XML)
{
    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $XML, $vals);
    xml_parser_free($xml_parser);
    // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
    $_tmp='';
    foreach ($vals as $xml_elem) {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_level!=1 && $x_type == 'close') {
            if (isset($multi_key[$x_tag][$x_level]))
                $multi_key[$x_tag][$x_level]=1;
            else
                $multi_key[$x_tag][$x_level]=0;
        }
        if ($x_level!=1 && $x_type == 'complete') {
            if ($_tmp==$x_tag)
                $multi_key[$x_tag][$x_level]=1;
            $_tmp=$x_tag;
        }
    }
    // jedziemy po tablicy
    foreach ($vals as $xml_elem) {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_type == 'open')
            $level[$x_level] = $x_tag;
        $start_level = 1;
        $php_stmt = '$xml_array';
        if ($x_type=='close' && $x_level!=1)
            $multi_key[$x_tag][$x_level]++;
        while ($start_level < $x_level) {
            $php_stmt .= '[$level['.$start_level.']]';
            if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
                $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
            $start_level++;
        }
        $add='';
        if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) {
            if (!isset($multi_key2[$x_tag][$x_level]))
                $multi_key2[$x_tag][$x_level]=0;
            else
                $multi_key2[$x_tag][$x_level]++;
            $add='['.$multi_key2[$x_tag][$x_level].']';
        }
        if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) {
            if ($x_type == 'open')
                $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
            else
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
            eval($php_stmt_main);
        }
        if (array_key_exists('attributes', $xml_elem)) {
            if (isset($xml_elem['value'])) {
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
                eval($php_stmt_main);
            }
            foreach ($xml_elem['attributes'] as $key=>$value) {
                $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
                eval($php_stmt_att);
            }
        }
    }
    return $xml_array;
}
?>

مرحبًا، أعتقد أن SimpleXml مفيد جدًا.ومعها أنا أستخدم com.xpath;

$xml = simplexml_load_file("som_xml.xml");

$blocks  = $xml->xpath('//block'); //gets all <block/> tags
$blocks2 = $xml->xpath('//layout/block'); //gets all <block/> which parent are   <layout/>  tags

أستخدم العديد من تكوينات XML وهذا يساعدني على تحليلها بسرعة كبيرة.SimpleXml هو مكتوب على C لذلك فهو سريع جدًا.

يعتمد ذلك على ما تحاول فعله بملفات XML.إذا كنت تحاول فقط قراءة ملف XML (مثل ملف التكوين)، فإن The Wicked Flea على حق في اقتراح SimpleXML لأنه ينشئ ما يصل إلى ArrayObjects المتداخلة.على سبيل المثالسيتم الوصول إلى القيمة بواسطة $xml->root->child.

إذا كنت تريد التعامل مع ملفات XML فمن الأفضل أن تستخدمها دوم XML

يعد المحلل اللغوي crxml وسيلة سهلة للتحليل اللغوي.

تحتوي هذه الفئة على وظيفة بحث، والتي تأخذ اسم العقدة مع أي مساحة اسم كوسيطة.يبحث في XML عن العقدة ويطبع بيان الوصول للوصول إلى تلك العقدة باستخدام هذه الفئة.هذا الفصل أيضًا يجعل إنشاء XML أمرًا سهلاً للغاية.

يمكنك تنزيل هذا الفصل على

http://freshmeat.net/projects/crxml

أو من phpclasses.org

http://www.phpclasses.org/package/6769-PHP-Manipulate-XML-documents-as-array.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top