قائمة طعام
مجاني
التسجيل
الصفحة الرئيسية  /  النصيحة/ ما هي موزعات XML وكيف يمكن أن تكون مفيدة. تحليل XML باستخدام SimpleXML Php تحليل xml

ما هي موزعات XML وكيف يمكن أن تكون مفيدة. تحليل XML باستخدام SimpleXML Php تحليل xml

في ذلك اليوم بدأت في إعادة صياغة نظام التقارير الداخلية للشركة ، حول الهيكل العام الذي كتبته منذ وقت ليس ببعيد. دون أن أحني قلبي ، سأقول إنني تقدمت فوق نفسي من حيث PHP ، ونتيجة لذلك ، أدركت أن خوارزمية النظام معوجة بما يكفي لإعادة كتابتها.

قبل ذلك ، تم تحليل مستند XML باستخدام وظائف مستعارة من PHP 4. ومع ذلك ، أعطت PHP5 للعالم شيئًا سهل الاستخدام يسمى SimpleXML. كيفية العمل معه ستناقش اليوم.

يجدر بنا أن نبدأ بحقيقة أن SimpleXML هو مكون إضافي منفصل ، وبالتالي يجب توصيله مسبقًا بالخادم المستخدم.

الآن يمكننا العمل!

من أجل معالجة المستند ، نستخدم وظيفة simplexml_load_file (). كمعامل ، يتم تمرير عنوان الملف بتنسيق eXtended Markup Language (XML - KO الخاص بك).

تكمن جمال هذه الوظيفة في أنه يمكنك بسهولة نقل ملف إليها من أي خادم. وبالتالي ، لدينا القدرة على معالجة تحميلات xml الخارجية (على سبيل المثال ، Yandex-XML أو موجز RSS لجهة خارجية).

تقوم الدالة بإخراج مصفوفة عند المخرج. المأزق الذي واجهته هو أن XML يمكن أن يكون له بنية خرقاء ، وبالتالي فإنني أنصحك بالبدء بتتبع مجازي وإخراج المصفوفة لفهم كيفية تعامل الوظيفة معها. بعد ذلك ، يمكنك البدء في معالجة البيانات المستلمة.

على سبيل المثال ، سآخذ بناء بسيط من هنا:


>
>
> PHP: تقديم المحلل اللغوي >
>
>
> تصلب متعدد. المبرمج >
> أونليفيا أكتورا >
>
>
> السيد. المبرمج >
> El ActÓ r >
>
> > السيد. محلل > > فلان الفلاني > > >
>
لذا فهي لغة. لا تزال لغة برمجة. أو
هل هي لغة برمجة؟ تم الكشف عن كل شيء في هذا الفيلم الوثائقي
مثل فيلم رعب.
>
>
> PHP يحل جميع مهام الويب الخاصة بي >
>
7>
5>
PG > >
>

فليكن ملف export.xml ، الذي يقع في جذر خادمي ، جنبًا إلى جنب مع البرنامج النصي الذي يعالج ذلك.
تم بناء المصفوفة وفقًا لهيكل عناصر DOM في مستند XML. تبدأ المعالجة من الجذر. للحصول على اسم Ms. المبرمج ، علينا بناء المسار التالي: $ xml-> movies-> movie-> الشخصيات-> character-> name.
يرجى ملاحظة أننا نختار قيمة معينة. هذا هو المكان الذي يتم فيه أخذ هذا النوع من الشخصيات - لا تنس أننا نعمل مع مصفوفة!

كما هو الحال مع أي مصفوفة ، يمكن معالجة بياناتنا باستخدام حلقة foreach. سيكون الرمز كما يلي:

$ xml = simplexml_load_file ("export.xml") ؛ // حمّل الملف
$ ttl = $ xml -> أفلام -> فيلم -> عنوان ؛ // حصلت على العنوان. إنه واحد ، فلا داعي لوضع أي قيمة أخرى

foreach ($ xml -> أفلام -> فيلم -> caracters مثل $ crc) // والآن دعونا نعمل في مجال الديناميكيات
{
// عرض أسماء الأبطال
$ name = $ crc -> caracter -> الاسم ؛
صدى صوت (" اسم $
"
) ;
}

سيضع هذا الرمز النص "PHP: Parser Appearance" في المتغير $ ttl ، ثم يعرض أسماء الأبطال سطرًا سطرًا
تصلب متعدد. المبرمج ، السيد. المبرمج ، السيد. محلل.

28.3 ك

لقد رأيت الكثير من موزعي xml ، لكنني لم أتطرق إلى برمجة الويب. الآن أريد أن أكتشف وأتعلم معك كيفية عمل محلل xml بسيط في php.

لأي غرض؟ ضروري!

لا ، حسنًا ، في الواقع: ملفات xml مفيدة جدًا. وأي محترف يجب ... لا ، لا يجب عليه ، ولكن يجب أن يعرف كيف يعمل معهم. هل نريد أن نصبح محترفين؟ إذا كنت في مدونتي ، فأنت لديك مثل هذه الرغبة.

سنفترض أننا نعرف ما هو XML ولن نصفه هنا. حسنًا ، إذا كنا لا نعرف ، فيمكننا اكتشاف ذلك بسهولة هنا: http://ru.wikipedia.org/wiki/XML

أثناء البحث عن طرق لتحليل XML في PHP ، اكتشفت مجموعة بسيطة من الوظائف في PHP للعمل مع ملفات XML تسمى "وظائف محلل XML". يبدأ التحليل بتهيئة المحلل اللغوي عن طريق استدعاء دالة xml_parser_create:

$ xml_parser = xml_parser_create () ؛

ثم نحتاج إلى إخبار المحلل اللغوي بالوظائف التي ستعالج علامات xml التي تأتي عبرها و معلومات نصيةفي عملية الاعراب. أولئك. تحتاج إلى تثبيت بعض المعالجات:

xml_set_element_handler ($ xml_parser، “startElement”، “endElement”)؛

هذه الوظيفة مسؤولة عن تحديد بداية العنصر ونهاية معالجات العنصر. على سبيل المثال ، إذا تم العثور على مجموعة في نص ملف xml ، فسيتم تشغيل وظيفة startElement عندما يعثر المحلل اللغوي على العنصر ، ووظيفة endElement عند العثور عليها.

تأخذ الدالتان startElement و endElement نفسها عدة معاملات وفقًا لوثائق php:

لكن كيف تقرأ البيانات من ملف؟ لم نر معلمة واحدة لهذا في أي من الوظائف حتى الآن! وأكثر من ذلك فيما بعد: قراءة الملف مسؤولية المبرمج ، أي. علينا استخدام الوظائف القياسية للعمل مع الملفات:

فتح الملف. والآن أنت بحاجة لقراءته سطرًا بسطر وإدخال سطور القراءة إلى وظيفة xml_parse:

خطأ XML: ".xml_error_string (xml_get_error_code ($ xml_parser)) ؛ صدى" في السطر ".xml_get_current_line_number ($ xml_parser) ؛ break ؛))؟>

هناك شيئان مهمان للغاية يجب ملاحظتهما هنا. الأول هو أن دالة xml_parse في المعلمة الثالثة تحتاج إلى تمرير علم قراءة السطر الأخير (صحيح - إذا كان السطر هو الأخير ، خطأ - إن لم يكن). والثاني هو أنه ، كما هو الحال في أي عمل ، يجب أن نحذر من الأخطاء هنا. الدالتان xml_get_error_code و xml_error_string مسؤولتان عن ذلك. تستقبل الوظيفة الأولى رمز الخطأ ، وتعيد الوظيفة الثانية ، بناءً على الرمز المستلم ، وصفًا نصيًا للخطأ. ماذا سيحدث نتيجة الخطأ - سننظر فيه لاحقًا. لا اقل وظيفة مفيدةسيخبرنا xml_get_current_line_number برقم السطر المعالج حاليًا في الملف.

وكالعادة ، يجب أن نحرر الموارد التي يشغلها النظام. لتحليل XML ، هذه هي وظيفة xml_parser_free:

xml_parser_free ($ xml_parser) ؛

هنا ، قمنا بتغطية الوظائف الرئيسية. حان الوقت لرؤيتهم في الممارسة. لهذا ابتكرت ملف xml بهيكل بسيط للغاية:




123

71234567890

دعنا نسمي هذا الملف data.xml ونحاول تحليله باستخدام الكود التالي:

العنصر: اسم $
"؛ // اسم العنصر $ عمق ++؛ // قم بزيادة العمق بحيث يعرض المتصفح المسافات البادئة لكل من ($ attrs كـ $ attr => $ value) (echo str_repeat (" "، $ عمق * 3)؛ // مسافة بادئة // عرض سمة الاسم وقيمتها صدى "السمة:". $ attr. "=". $ value. "
"؛)) وظيفة endElement (محلل $ ، اسم $) (عمق $ عالمي ؛ عمق $ - ؛ // تقليل العمق) $ عمق = 0 ؛ ملف $ =" data.xml "؛ $ xml_parser = xml_parser_create () ؛ xml_set_element_handler ($ xml_parser، "startElement"، "endElement") ؛ if (! ($ fp = fopen ($ file، "r"))) (die ("تعذر فتح إدخال XML") ؛) بينما ($ data = fgets ($ fp)) (if (! xml_parse ($ xml_parser، $ data، feof ($ fp))) (echo "
خطأ XML: "؛ echo xml_error_string (xml_get_error_code ($ xml_parser))؛ echo" at line ".xml_get_current_line_number ($ xml_parser)؛ break؛)) xml_parser_free ($ xml_parser)؛؟>

كنتيجة لأبسط برنامج نصي قمنا بتطويره ، عرض المتصفح المعلومات التالية في نافذته:

العنصر: الجذر
العنصر: INFO
السمة: منظمة الصحة العالمية = ملكي
العنصر: العنوان

السمة: KVARTIRA = 12
السمة: DOM = 15
العنصر: الهاتف

دعنا نحاول إفساد ملف XML عن طريق استبدال العلامة تشغيل وترك علامة الإغلاق كما هي:

العنصر: الجذر
العنصر: INFO
السمة: منظمة الصحة العالمية = ملكي
العنصر: العنوان
السمة: ULICA = شارعي !!
السمة: KVARTIRA = 12
السمة: DOM = 15
العنصر: هاتف

خطأ XML: علامة غير متطابقة في السطر 5

رائع! رسائل الخطأ تعمل! علاوة على ذلك ، فهي مفيدة للغاية.

آه ، لقد نسيت شيئًا آخر ... لم نعرض النص الموجود داخل العنوان وبطاقات الهاتف. نصلح عيوبنا - نضيف معالج نص باستخدام وظيفة xml_set_character_data_handler:

xml_set_character_data_handler ($ xml_parser، 'stringElement') ؛

وأضف دالة المعالج نفسها إلى الكود.

محلل Xmlهو برنامج مقتطف من مصدر الملفبيانات تنسيق xml وحفظها أو استخدامها للإجراءات اللاحقة.

لماذا هناك حاجة إلى موزعي xml؟

في المقام الأول لأن تنسيق xml نفسه شائع بين معايير الكمبيوتر. يبدو ملف XML كالتالي:

أولئك. في الواقع هناك علامات ، وهناك بعض القواعد التي يجب أن تتبع العلامات بعضها البعض.

سبب شعبية ملفات xml هو أنها سهلة القراءة من قبل الإنسان. وحقيقة أنه من السهل نسبيًا التعامل معها في البرامج.

سلبيات ملفات xml.

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

كيف تتم كتابة موزعي XML؟

المحللون مكتوبون بلغات البرمجة. كما يقولون ، لقد كُتبت جميعها ، لكن ليس في بعضها. يجب أن يكون مفهوماً أن هناك لغات برمجة تحتوي بالفعل على مكتبات مضمنة لتحليل ملفات xml. لكن على أي حال ، حتى في حالة عدم وجود مكتبة ، يمكنك دائمًا العثور على مكتبة مناسبة لهذه الحالة واستخدامها لاستخراج البيانات من ملف.

بشكل عام ، هناك طريقتان مختلفتان لكيفية تحليل ملفات xml.

الأول هو تحميل ملف xml بالكامل في الذاكرة ثم القيام بمعالجات استخراج البيانات.

الثاني هو خيار التدفق. في هذه الحالة ، تحدد لغة البرمجة علامات معينة يجب أن تستجيب لها وظائف محلل xml الذي تم إنشاؤه ، ويقرر المبرمج نفسه ما يجب فعله إذا تم العثور على علامة معينة.

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

مطلوب قدر كبير من الذاكرة للعمل. في بعض الأحيان ، قد أقول إنه يحدث غالبًا أنه من المستحيل معالجة ملف xml وتحليله ، أي إنشاء محلل xml ليعمل بشكل صحيح بالطريقة الأولى. لماذا هذا؟ حسنًا ، على سبيل المثال ، يسمح تقييد تطبيقات 32 بت تحت Windows للبرنامج باحتلال 2 غيغابايت كحد أقصى من الذاكرة - لا أكثر.

ومع ذلك ، من الصعب البرمجة باستخدام خيار البث. يزداد التعقيد مع استخراج خطير بدرجة كافية ، مما يؤثر بالتالي على التوقيت والميزانية.

صلاحية ومحللات ملفات xml.

كل شيء سيكون على ما يرام مع ملفات xml ومحللات xml ، ولكن هناك مشكلة. نظرًا لحقيقة أن "أي طالب" يمكنه إنشاء ملف xml ، إلا أنه في الواقع هو كذلك (نظرًا لأن الكثير من التعليمات البرمجية يكتبها تلاميذ المدارس ، تظهر ملفات غير صالحة ، أي ملفات غير صحيحة. ماذا يعني هذا وما هي المخاطر؟ ؟ ، هذا هو أنه من المستحيل في بعض الأحيان تحليل ملف غير صالح بشكل صحيح. على سبيل المثال ، لا يتم إغلاق علاماته كما يتوقع المرء بالمعيار ، أو على سبيل المثال تم تعيين الترميز بشكل غير صحيح. وهناك مشكلة أخرى وهي أنه إذا ، على سبيل المثال ، تقوم بعمل محلل على .net ، ثم يمكنك إنشاء ما يسمى بغلاف ، ويحدث الشيء الأكثر إزعاجًا عندما تقوم بعمل مثل هذا الغلاف ، ثم تقرأه ملفًا أنشأه "الطالب" ، ولكن الملف هو غير صالح ومن المستحيل قراءته. = لأن العديد من الأشخاص يقومون بإنشاء ملفات xml بدون استخدام المكتبات القياسيةوبنفور كامل من جميع معايير ملفات xml. من الصعب شرح ذلك للعملاء. إنهم ينتظرون النتيجة - محلل xml الذي يحول البيانات من الملف الأصلي إلى تنسيق مختلف.

كيفية إنشاء موزعي xml (الخيار الأول)

توجد لغة للاستعلام عن بيانات XML مثل Xpath. هذه اللغة لها إصداران ، ولن نتعمق في تفاصيل كل إصدار. سيُظهر فهم أفضل لهذه اللغة أمثلة على كيفية استخدامها لاسترداد البيانات. على سبيل المثال.

// div [@ class = "supcat guru"] / أ

ماذا يفعل هذا الطلب. يأخذ كل العلامات التي تحتوي على نطاق يحتوي على النص index.xml؟ Hid = ويجب أن تكون هذه العلامة div مع فئة مساوية لـ supcat guru.

نعم ، لأول مرة قد لا يكون الأمر واضحًا بدرجة كافية ، ولكن مع ذلك ، يمكنك معرفة ذلك إذا كنت تريد ذلك. نقطة البداية بالنسبة لي هي http://en.wikipedia.org/wiki/XPath وأنا أنصحك بذلك.


يُسمح بنشر هذه المقالة فقط من خلال رابط إلى موقع الويب الخاص بمؤلف المقال

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

توجد مشكلتان عند تحليل ملفات XML كبيرة الحجم:
1. لا توجد ذاكرة كافية.
2. لا يوجد وقت كافٍ مخصص لعمل البرنامج النصي.

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

تحتوي PHP على العديد من خيارات معالجة XML المضمنة - SimpleXML و DOM و SAX.
تم تفصيل كل هذه الخيارات في العديد من أمثلة المقالات ، لكن جميع الأمثلة توضح العمل مع مستند XML كامل.

هنا مثال واحد ، حصلنا على كائن من ملف XML

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

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

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

الوظيفة webi_xml (ملف $)
{

########
### وظيفة للعمل مع البيانات

{
طباعة بيانات $؛
}
############################################



{
طباعة اسم $؛
print_r ($ attrs) ؛
}


## وظيفة علامة النهاية
دالة endElement (محلل $ ، اسم $)
{
طباعة اسم $؛
}
############################################

($ xml_parser، "data")؛

// افتح الملف
$ fp = fopen ($ file، "r")؛

$ perviy_vxod = 1 ؛ بيانات دولار = "" ؛



{

simvol $ = fgetc ($ fp) ؛ بيانات دولار. = $ simvol؛


إذا ($ simvol! = ">") (تابع ؛)


صدى صوت "

استراحة؛
}

بيانات دولار = "" ؛
}
fclose ($ fp) ؛

Webi_xml ("1.xml") ؛

?>

في هذا المثال ، أضع كل شيء في وظيفة واحدة webi_xml () وفي الأسفل يمكنك رؤية دعوتها.
يتكون النص نفسه من ثلاث وظائف رئيسية:
1. الوظيفة التي تلتقط فتح علامة startElement ()
2. وظيفة تلتقط إغلاق علامة endElement ()
3. ووظيفة استقبال البيانات ().

افترض أن محتويات الملف 1.xml هي بعض الوصفات



< title >خبز بسيط
< ingredient amount = "3" unit = "стакан" >طحين
< ingredient amount = "0.25" unit = "грамм" >خميرة
< ingredient amount = "1.5" unit = "стакан" >ماء دافئ
< ingredient amount = "1" unit = "чайная ложка" >ملح
< instructions >
< step > تخلط جميع المكونات وتعجن جيدا.
< step > غطيها بقطعة قماش واتركيها لمدة ساعة في غرفة دافئة..
< step > اعجن مرة أخرى, نضع على صينية خبز ونضعها في الفرن.
< step > قم بزيارة موقع الموقع


نبدأ جميعًا باستدعاء الوظيفة المشتركة webi_xml ("1.xml") ؛
علاوة على ذلك في هذه الوظيفة ، يبدأ المحلل اللغوي ويتم تحويل جميع أسماء العلامات إلى أحرف كبيرة بحيث يكون لكل العلامات نفس الحالة.

$ xml_parser = xml_parser_create () ؛
xml_parser_set_option ($ xml_parser ، XML_OPTION_CASE_FOLDING ، صحيح) ؛

نشير الآن إلى الوظائف التي ستعمل لالتقاط فتح العلامة وإغلاق البيانات ومعالجتها

xml_set_element_handler ($ xml_parser، "startElement"، "endElement")؛
xml_set_character_data_handler($ xml_parser، "data")؛

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

وأرسلها إلى المحلل اللغوي
xml_parse ($ xml_parser، $ data، feof ($ fp));
بعد معالجة البيانات ، يتم تجاهل متغير السلسلة ويبدأ جمع البيانات في السلسلة مرة أخرى وتتشكل السلسلة مرة ثانية

في المجموعة الثالثة
</b><br>في الرابع <br><b>خبز بسيط

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

le> خبز بسيط
لا يمكنك إرسال البيانات إلى المعالج بهذه الطريقة ، لأن العلامة تعطلت.
يمكنك ابتكار طريقتك الخاصة لإرسال البيانات إلى المعالج ، على سبيل المثال ، جمع 1 ميغا بايت من البيانات وإرسالها إلى المعالج لزيادة السرعة ، فقط تأكد من اكتمال العلامات دائمًا وإمكانية كسر البيانات
بسيط</b><br><b>خبز

وهكذا ، في أجزاء ، كما يحلو لك ، يمكنك إرسال ملف كبيرفي المعالج.

الآن دعونا نلقي نظرة على كيفية معالجة هذه البيانات وكيفية الحصول عليها.

لنبدأ بوظيفة العلامات الافتتاحية startElement (محلل $ ، $ name ، attrs $)
لنفترض أن المعالجة وصلت إلى الخط
< ingredient amount = "3" unit = "стакан" >طحين
بعد ذلك ، داخل الدالة ، سيكون المتغير $ name مساويًا لـ المكوناتوهذا يعني ، اسم العلامة المفتوحة (لم يحن بعد لإغلاق العلامة).
أيضًا ، في هذه الحالة ، ستتوفر مجموعة من السمات لعلامة $ attrs ، حيث ستكون هناك بيانات الكمية = "3" والوحدة = "زجاج".

بعد ذلك ، تتم معالجة بيانات العلامة المفتوحة مع الوظيفة البيانات (محلل دولار ، بيانات دولار)
سيحتوي المتغير data $ على كل شيء بين علامتي الافتتاح والختام ، وهذا هو النص Flour في حالتنا

وتكتمل معالجة السلسلة بواسطة الوظيفة endElement (محلل $ ، $ name)
هذا هو اسم العلامة المغلقة ، في حالتنا سيكون $ name مساويًا لـ المكونات

وبعد ذلك ، ذهب كل شيء في دائرة مرة أخرى.

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

الوظيفة webi_xml (ملف $)
{
webi_depth $ العالمية ؛ // عداد لتتبع عمق التعشيش
webi_depth دولار = 0 ؛
عالمي $ webi_tag_open؛ // سيحتوي على مجموعة من العناصر المفتوحة في هذه اللحظةالعلامات
$ webi_tag_open = مجموعة () ؛
عالمي $ webi_data_temp؛ // ستحتوي هذه المصفوفة على بيانات علامة واحدة

####################################################
### وظيفة للعمل مع البيانات
بيانات الوظيفة (محلل $ ، بيانات $)
{
webi_depth $ العالمية ؛
عالمي $ webi_tag_open؛
عالمي $ webi_data_temp؛
// إضافة بيانات إلى المصفوفة تشير إلى علامة التداخل والمفتوحة حاليًا
$ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["البيانات"]. = $ data؛
}
############################################

####################################################
### وظيفة العلامات الافتتاحية
دالة startElement (محلل $ ، $ name ، attrs $)
{
webi_depth $ العالمية ؛
عالمي $ webi_tag_open؛
عالمي $ webi_data_temp؛

// إذا لم يعد مستوى التداخل صفرًا ، فهذا يعني أن علامة واحدة مفتوحة بالفعل
// والبيانات منه موجودة بالفعل في المصفوفة ، يمكنك معالجتها
إذا (webi_depth $)
{




" ;

مطبعة "
" ;
print_r ($ webi_tag_open) ؛ // مجموعة من العلامات المفتوحة
مطبعة "


" ;

// بعد معالجة البيانات ، احذفها لتحرير الذاكرة
unset ($ GLOBALS ["webi_data_temp"] [$ webi_depth]) ؛
}

// الآن بدأ فتح العلامة التالية وستتم المعالجة الإضافية في الخطوة التالية
webi_depth ++ دولار ؛ // زيادة التعشيش

$ webi_tag_open [$ webi_depth] = $ name؛ // إضافة العلامة المفتوحة إلى مصفوفة المعلومات
$ webi_data_temp [$ webi_depth] [$ name] ["attrs"] = $ attrs؛ // الآن أضف سمات العلامة

}
###############################################

#################################################
## وظيفة علامة النهاية
دالة endElement (محلل $ ، اسم $) (
webi_depth $ العالمية ؛
عالمي $ webi_tag_open؛
عالمي $ webi_data_temp؛

// هذا هو المكان الذي تبدأ فيه معالجة البيانات ، على سبيل المثال ، الإضافة إلى قاعدة البيانات ، والحفظ في ملف ، وما إلى ذلك.
// $ webi_tag_open يحتوي على سلسلة من العلامات المفتوحة حسب مستوى التداخل
// على سبيل المثال $ webi_tag_open [$ webi_depth] يحتوي على اسم العلامة المفتوحة التي تتم معالجة المعلومات الخاصة بها حاليًا
// مستوى تداخل علامة webi_depth $
// $ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["attrs"] مصفوفة سمات العلامات
// $ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["بيانات"] بيانات العلامة

طباعة "البيانات". $ webi_tag_open [$ webi_depth]. "-". ($ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["البيانات"]). "
" ;
print_r ($ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["attrs"]) ؛
مطبعة "
" ;
print_r ($ webi_tag_open) ؛
مطبعة "


" ;

Unset ($ GLOBALS ["webi_data_temp"]) ؛ // بعد معالجة البيانات ، احذف المصفوفة بأكملها بالبيانات ، منذ أن تم إغلاق العلامة
unset ($ GLOBALS ["webi_tag_open"] [$ webi_depth]) ؛ // إزالة المعلومات حول هذه العلامة المفتوحة ... منذ إغلاقها

webi_depth $ -؛ // تقليل التداخل
}
############################################

$ xml_parser = xml_parser_create () ؛
xml_parser_set_option ($ xml_parser ، XML_OPTION_CASE_FOLDING ، صحيح) ؛

// تحديد الوظائف التي ستعمل عند فتح وإغلاق العلامات
xml_set_element_handler ($ xml_parser، "startElement"، "endElement")؛

// تحديد وظيفة للعمل مع البيانات
xml_set_character_data_handler($ xml_parser، "data")؛

// افتح الملف
$ fp = fopen ($ file، "r")؛

$ perviy_vxod = 1 ؛ // flag للتحقق من إدخال الملف الأول
بيانات دولار = "" ؛ // هنا نجمع البيانات من الملف في أجزاء ونرسلها إلى المحلل اللغوي xml

// حلقة حتى يتم العثور على نهاية الملف
بينما (! feof ($ fp) و $ fp)
{
simvol $ = fgetc ($ fp) ؛ // قراءة حرف واحد من الملف
بيانات دولار. = $ simvol؛ // أضف هذا الرمز إلى البيانات المراد إرسالها

// إذا لم يكن الحرف علامة نهاية ، فإننا نعود إلى بداية الحلقة ونضيف حرفًا آخر إلى البيانات ، وهكذا حتى يتم العثور على علامة النهاية
إذا ($ simvol! = ">") (تابع ؛)
// إذا تم العثور على علامة إغلاق ، أرسل الآن هذه البيانات المجمعة للمعالجة

// تحقق مما إذا كان هذا هو الإدخال الأول في الملف ، ثم احذف كل شيء قبل العلامة// لأنه في بعض الأحيان يمكن العثور على البيانات المهملة قبل بداية XML (المحررات الخرقاء ، أو يتم استلام الملف بواسطة برنامج نصي من خادم آخر)
إذا ($ perviy_vxod) ($ data = strstr ($ data، "

// الآن نقوم برمي البيانات في محلل xml
if (! xml_parse ($ xml_parser، $ data، feof ($ fp))) (

// هنا يمكنك معالجة والحصول على أخطاء من أجل الصلاحية ...
// بمجرد اكتشاف خطأ ، يتوقف التحليل
صدى صوت "
خطأ XML: ". Xml_error_string (xml_get_error_code ($ xml_parser)) ؛
صدى "على الخط". xml_get_current_line_number ($ xml_parser) ؛
استراحة؛
}

// بعد التحليل ، تجاهل البيانات التي تم جمعها للخطوة التالية من الدورة.
بيانات دولار = "" ؛
}
fclose ($ fp) ؛
xml_parser_free ($ xml_parser) ؛
// إزالة المتغيرات العالمية
unset ($ GLOBALS ["webi_depth"]) ؛
unset ($ GLOBALS ["webi_tag_open"]) ؛
unset ($ GLOBALS ["webi_data_temp"]) ؛

Webi_xml ("1.xml") ؛

?>

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

حسنًا ، هذا كل شيء ، يوجد الآن ذاكرة كافية عند معالجة ملف بأي حجم ، ولكن يمكن زيادة وقت تشغيل البرنامج النصي بعدة طرق.
في بداية البرنامج النصي ، أدخل الوظيفة
set_time_limit (6000) ؛
أو
ini_set ("max_execution_time"، "6000") ؛

أو أضف النص إلى ملف htaccess الخاص بك
php_value max_execution_time 6000

ستزيد هذه الأمثلة من وقت تشغيل البرنامج النصي إلى 6000 ثانية.
يمكنك زيادة الوقت بهذه الطريقة فقط في وضع التعطيل.

إذا كان لديك حق الوصول لتحرير php.ini ، يمكنك زيادة الوقت باستخدام ملفات
max_execution_time = 6000

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

في المقال الأخير نحن معكم ، وقد وعدت أنه في المقال التالي سنحلله. واليوم سأريك كيف يمكنك ذلك تحليل مستند XML في PHP.

أقترح تحليل المستند الذي أنشأناه في المقالة الأخيرة ، وإخراج البيانات ببساطة من هناك إلى المتصفح. هذا هو كود البرنامج النصي:

$ dom = domDocument الجديد ("1.0"، "utf-8")؛ // قم بإنشاء مستند XML الإصدار 1.0 بترميز utf-8
$ dom-> load ("users.xml")؛ // تحميل مستند XML من ملف إلى كائن DOM
$ root = $ dom-> documentElement؛ // احصل على عنصر الجذر
$ childs = $ root-> childNodes ؛ // احصل على أبناء عنصر الجذر
/ * نحن نكرر العناصر المستلمة * /
لـ ($ i = 0 ؛ $ i< $childs->الطول؛ i ++ دولار أمريكي) (
$ user = $ childs-> item ($ i) ؛ // احصل على العنصر التالي من NodeList
$ lp = $ user-> childNodes؛ // احصل على أبناء عقدة "المستخدم"
$ id = $ user-> getAttribute ("id") ؛ // احصل على قيمة سمة "id" لعقدة "المستخدم"
$ login = $ lp-> item (0) -> nodeValue ؛ // احصل على قيمة عقدة "تسجيل الدخول"
$ password = $ lp-> item (1) -> nodeValue ؛ // احصل على قيمة العقدة "كلمة المرور"
/ * طباعة البيانات المستلمة * /
صدى "المعرف: $ id
";
صدى "تسجيل الدخول: $ login
";
صدى "كلمة المرور: $ password
";
صدى صوت "-----------------------
";
}
?>

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