العمل مع XML لحساب الكائنات. تحليل بيانات XML. من الكائن إلى المصفوفة العادية

09.10.2021

المرحلة 1. اجتياز الاختبار (التفاعل مع دائرة اختبار GIS GMP) #GIS عنوان خدمة اختبار GMP:
gisgmp.wsdlLocation=http://213.59.255.182:7777/gateway/services/SID0003663?wsdl
gisgmp.wsdlLocation.endPoint=http://213.59.255.182:7777/gateway/services/SID0003663
يتم تسجيل هذا العنوان في إعدادات SP بالإضافة إلى ذلك، تحتاج إلى تسجيله في ملف إعدادات التسجيل، مع تحديد القيمة يتعقب. بعد إدخال القيم المحددة، تحتاج إلى بدء تشغيل SP وعميل ACC (إعادة التشغيل إذا تم إطلاقه بالفعل). بعد ذلك، من ROR أو تطبيق مكتب المحاسبة/AU لدفع الأموال، تحتاج إلى تنفيذ الإجراء "إنشاء معلومات الدفع"، إذا تم اجتياز ضوابط النظام، فسيتم إنشاء المعلومات الخاصة بالدفع. والتي سوف تحتاج في وقت لاحق إلى تفريغها.
بعد التحميل، يتعين عليك التحقق من الحالة باستخدام إجراء "حالة معالجة الطلب". وبعد ذلك تتحول معلومات الدفع الخاصة بـ ED إلى الحالة "مقبول بواسطة GIS GMP" -...

منح:جدول MSG (الرسائل) مع عدد كبيرالسجلات.
CREATETABLEmsg(idINTEGERNOTNULLPRIMARYKEY,descriptionCHAR(50)NOTNULL, date_createDATE);
مهمة:
من الضروري مسح جدول البيانات/
حل:هناك عدة طرق لحل هذه المشكلة. فيما يلي وصف ومثال لكل واحد منهم.
اسهل طريقة( الخيار الأول) - تنفيذ عامل حذف السجل. عند تنفيذها، سترى النتيجة (كم عدد السجلات التي تم حذفها). شيء مفيد عندما تحتاج إلى معرفة وفهم ما إذا كان قد تم حذف البيانات الصحيحة أم لا. ولكن لها عيوب مقارنة بالخيارات الأخرى لحل المشكلة.

DELETE FROMmsg;--حذف كافة الصفوف في الجدول --حذف جميع الصفوف ذات تاريخ الإنشاء "2019.02.01"حذف من الرسالة WHEREdate_create="2019.02.01";

الخيار الثاني. استخدام عبارة DML لمسح كافة الصفوف في الجدول.
TRUNCATETABLEmsg;
هناك العديد من الميزات لاستخدام هذا المشغل:
وهو غير متوفر في Firebird، لذلك نستخدم الخيارين الأول والثالث بعد الانتهاء...

العناوين الحالية لطلبات SMEV 3.0 نذكرك أنه وفقًا للمعلومات المنشورة مسبقًا على بوابة تكنولوجيا SMEV 3.0، من الضروري استخدام العناوين الحالية لوضع العناوين الموحدة الخدمة الإلكترونية:
عنوان الخدمة الإلكترونية الموحدة لبيئة تطوير SMEV 3.0، الموافق للمخطط 1.1 - http://smev3-d.test.gosuslugi.ru:7500/smev/v1.1/ws?wsdl، وستتم الخدمة أيضًا تكون متاحة في

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

المثال رقم 1: ملف example.php بسلسلة XML

$xmlstr =<<


PHP: ظهور المحلل اللغوي


آنسة. المبرمج
أونليفيا أكتورا


السيد. المبرمج
الممثل


إذن فهي لغة. إنها لا تزال لغة برمجة. أو
هل هذه لغة برمجة؟ كل ذلك تم الكشف عنه في هذا الفيلم الوثائقي،
مثل فيلم رعب.




7
5


XML؛
?>

SimpleXML سهل الاستخدام للغاية! حاول الحصول على سلسلة أو رقم من مستند XML الأساسي.

المثال رقم 2: استرجاع جزء من مستند

تضمين "example.php" ؛

صدى $movies -> فيلم [ 0 ]-> مؤامرة ;
?>

إذن فهي لغة. إنها لا تزال لغة برمجة. أم أنها لغة نصية؟ تم الكشف عن كل شيء في هذا الفيلم الوثائقي الشبيه بفيلم الرعب.

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

المثال رقم 3: الحصول على سلسلة

تضمين "example.php" ؛

echo $movies -> movie ->( "great-lines")-> line ;
?>

نتيجة تشغيل هذا المثال:

PHP يحل جميع مشاكل الويب الخاصة بي

المثال رقم 4: الوصول إلى العناصر غير الفريدة في SimpleXML

إذا كانت هناك مثيلات متعددة للعناصر الفرعية داخل نفس العنصر الأصلي، فيجب استخدام أساليب التكرار القياسية.

تضمين "example.php" ؛

$movies = new SimpleXMLElement ($xmlstr );

/* لكل عقدة ، سوف نعرض الاسم بشكل منفصل . */
foreach ($أفلام -> فيلم -> أحرف -> حرف كحرف $) (
صدى $character -> الاسم، "مسرحيات"، $character -> ممثل، PHP_EOL؛
}

?>

نتيجة تشغيل هذا المثال:

آنسة. يلعب Coder دور Onlivia Actora Mr. يلعب المبرمج دور الممثل

تعليق:

ملكيات ( $أفلام->فيلمفي المثال السابق) ليست صفائف. هذا قابل للتكرارهدف كمصفوفة.

المثال رقم 5 استخدام السمات

حتى الآن قمنا فقط باسترجاع أسماء العناصر وقيمها. يمكن لـ SimpleXML أيضًا الوصول إلى سمات العناصر. ).

تضمين "example.php" ؛

$movies = new SimpleXMLElement ($xmlstr );

يمكنك الوصول إلى سمة العنصر بنفس طريقة الوصول إلى عناصر المصفوفة ( صفيف
/* عقدة الوصول
الفيلم الأول.
* سنعرض أيضًا مقياس التقييم. */ foreach ($أفلام -> فيلم [ 0 ]-> تصنيف كـ $ rating ) (
التبديل ((سلسلة) $ rating [ "النوع" ]) (
// الحصول على سمات العنصر حسب الفهرس
حالة "الإبهام":
صدى $ rating، "ممتاز" ؛
استراحة؛
حالة "الإبهام":
}
}
?>

حالة "النجوم": صدى $ rating، "النجوم" ؛:

7 ممتاز 5 نجوم

المثال رقم 6 مقارنة العناصر والسمات بالنص

لمقارنة عنصر أو سمة بسلسلة، أو لتمريرها إلى دالة كنص، يجب عليك تحويلها إلى سلسلة باستخدام (خيط). بخلاف ذلك، ستتعامل PHP مع العنصر ككائن.

تضمين "example.php" ؛

$movies = new SimpleXMLElement ($xmlstr );

إذا ((سلسلة) $movies -> فيلم -> العنوان == "PHP: ظهور المحلل اللغوي") {
مطبعة "فيلمي المفضل.";
}

echo htmlentities ((string) $movies -> movie -> title );
?>

نتيجة تشغيل هذا المثال:

فيلمي المفضل PHP: ظهور المحلل اللغوي

مثال رقم 7 مقارنة عنصرين

يعتبر عنصران SimpleXMLElements مختلفين حتى لو كانا يشيران إلى نفس الكائن اعتبارًا من PHP 5.2.0.

تضمين "example.php" ؛

$movies1 = SimpleXMLElement الجديد ($xmlstr );
$movies2 = SimpleXMLElement الجديد ($xmlstr );
var_dump($movies1 == $movies2); // خطأ منذ PHP 5.2.0
?>

نتيجة تشغيل هذا المثال:

المثال رقم 8 باستخدام XPath

يتضمن SimpleXML دعم XPath المدمج. :

تضمين "example.php" ؛

$movies = new SimpleXMLElement ($xmlstr );

البحث في كافة العناصر
صدى $character -> الاسم، "مسرحيات"، $character -> ممثل، PHP_EOL؛
}
?>

"// foreach ($movies -> xpath ("//character") كـ $character ) (

نتيجة تشغيل هذا المثال:

" بمثابة حرف بدل. لتحديد مسار مطلق، قم بحذف إحدى الخطوط المائلة للأمام.

آنسة. يلعب Coder دور Onlivia Actora Mr. يلعب المبرمج بواسطة الممثل

المثال رقم 9: تحديد القيم

تضمين "example.php" ؛
ليس من الضروري أن تكون البيانات الموجودة في SimpleXML غير قابلة للتغيير. يتيح لك الكائن التعامل مع جميع العناصر.

$movies = new SimpleXMLElement ($xmlstr );

$movies -> الفيلم [ 0 ]-> الشخصيات -> الشخصية [ 0 ]-> الاسم = "Miss Coder" ;
?>

نتيجة تشغيل هذا المثال:

PHP: ظهور المحلل اللغوي صدى $movies -> asXML(); أونليفيا أكتورا السيد. المبرمج الممثل 7 5

سيدة المبرمج

مثال رقم 10 إضافة عناصر وسمات

تضمين "example.php" ؛
ليس من الضروري أن تكون البيانات الموجودة في SimpleXML غير قابلة للتغيير. يتيح لك الكائن التعامل مع جميع العناصر.

منذ الإصدار PHP 5.1.3، أصبح لدى SimpleXML القدرة على إضافة عناصر وسمات فرعية بسهولة.
حرف $ = أفلام $ -> فيلم [ 0 ]-> أحرف -> addChild ("حرف")؛
$character -> addChild( "name" , "Mr. Parser" );

$character -> addChild ("actor" , "John Doe" );
$ rating = $movies -> movie [ 0 ]-> addChild (" rating " , "PG" );

$movies -> الفيلم [ 0 ]-> الشخصيات -> الشخصية [ 0 ]-> الاسم = "Miss Coder" ;
?>

نتيجة تشغيل هذا المثال:

PHP: ظهور المحلل اللغوي آنسة. المبرمج أونليفيا أكتورا السيد. المبرمج الممثل $ rating -> addAttribute ("type" , "mpaa" );السيد. محلل جون دو إذن فهي لغة. إنها لا تزال لغة برمجة. أم أنها لغة نصية؟ تم الكشف عن كل شيء في هذا الفيلم الوثائقي الشبيه بفيلم الرعب. 7 5 PHP يحل جميع مشاكل الويب الخاصة بي

ص

المثال رقم 11: التفاعل مع DOM

يمكن لـ PHP تحويل عقد XML من تنسيق SimpleXML إلى تنسيق DOM والعكس. يوضح هذا المثال كيف يمكنك تغيير عنصر DOM في SimpleXML.
$dom = DOMDocument الجديد؛ "$dom -> تحميلXML (" );
هراء
إذا (! $dom) ( صدى;
"خطأ في تحليل المستند"
}

مخرج؛

كتب $ = simplexml_import_dom($dom);
?>

نتيجة تشغيل هذا المثال:

echo $books -> book [ 0 ]-> title ;

هناك "خدعة" شائعة غالبًا ما يتم اقتراحها لتحويل كائن SimpleXML إلى مصفوفة، عن طريق تشغيله من خلال json_encode() ثم json_decode(). أود أن أشرح لماذا هذه فكرة سيئة.

بكل بساطة، لأن الهدف الأساسي من SimpleXML هو أن تكون أسهل في الاستخدام وأكثر قوة من المصفوفة العادية. على سبيل المثال، يمكنك الكتابةbar -> baz [ "bing" ] ?> وهي تعني نفس الشيءbar [ 0 ]-> baz [ 0 ] [ "bing" ] ?> بغض النظر عن عدد عناصر bar أو baz الموجودة في ملف XML؛ وإذا كتبتشريط [ 0 ]-> baz [ 0 ] ?> تحصل على كل محتوى السلسلة لتلك العقدة - بما في ذلك أقسام CDATA - بغض النظر عما إذا كانت تحتوي أيضًا على عناصر فرعية أو سمات. لديك أيضًا إمكانية الوصول إلى معلومات مساحة الاسم، والقدرة على إجراء تعديلات بسيطة على XML، وحتى القدرة على "الاستيراد" إلى كائن DOM، من أجل معالجة أكثر قوة. يتم فقدان كل هذا عن طريق تحويل الكائن إلى مصفوفة بدلاً من قراءة فهم الأمثلة الموجودة في هذه الصفحة.

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

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

منذ عامين

إذا كانت سلسلة XML الخاصة بك تحتوي على قيم منطقية مشفرة بـ "0" و"1"، فسوف تواجه مشكلات عند إرسال العنصر مباشرة إلى bool:

$xmlstr =<<

1
0

XML؛
$values ​​​​= new SimpleXMLElement($xmlstr);
$truevalue = (bool)$values->truevalue; // حقيقي
$falsevalue = (bool)$values->falsevalue; // صحيح أيضا!!!

بدلاً من ذلك، تحتاج إلى الإرسال إلى السلسلة أو int أولاً:

$truevalue = (bool)(int)$values->truevalue; // حقيقي
$falsevalue = (bool)(int)$values->falsevalue; // خطأ شنيع

منذ 9 سنوات

إذا كنت بحاجة إلى إخراج ملف xml صالح في استجابتك، فلا تنس ضبط نوع محتوى الرأس الخاص بك على xml بالإضافة إلى تكرار نتيجة asXML():

$xml = simplexml_load_file("...");
...
... أشياء XML
...

// إخراج XML في ردك:
header("نوع المحتوى: نص/xml");
صدى $xml -> asXML();
?>

منذ 9 سنوات

من الملف التمهيدي:

من المفترض أن يكون SimpleXML طريقة سهلة للوصول إلى بيانات XML.

تتبع كائنات SimpleXML أربع قواعد أساسية:

1) تشير الخصائص إلى تكرارات العناصر
2) تشير المؤشرات الرقمية إلى العناصر
3) تشير المؤشرات غير الرقمية إلى السمات
4) يسمح تحويل السلسلة بالوصول إلى بيانات النص

عند تكرار الخصائص، يتكرر الامتداد دائمًا
جميع العقد التي تحمل اسم العنصر هذا. هكذا يجب أن تكون الطريقة children()
تم استدعاؤه للتكرار عبر العقد الفرعية. ولكن أيضًا القيام بما يلي:
foreach ($obj->node_name كـ $elem) (
// افعل شيئًا باستخدام $elem
}
يؤدي دائمًا إلى تكرار عناصر "node_name". لذلك لا مزيد من ذلك
هناك حاجة إلى التحقق لتمييز عدد العقد من هذا النوع.

عندما يتم الوصول إلى بيانات TEXT للعناصر من خلال خاصية
ثم لا تتضمن النتيجة البيانات النصية للعناصر الفرعية.

القضايا المعروفة
============

بسبب مشاكل في المحرك، لا يمكن الوصول إليه حاليًا
عنصر فرعي حسب الفهرس 0: $object->property.

منذ 8 سنوات

استخدام أشياء مثل: is_object($xml->module->admin) للتحقق مما إذا كانت هناك بالفعل عقدة تسمى "admin"، لا يبدو أنه يعمل كما هو متوقع، نظرًا لأن simplexml يُرجع كائنًا دائمًا - في هذه الحالة يكون كائنًا فارغًا - حتى لو كانت عقدة معينة غير موجودة.
بالنسبة لي يبدو أن الوظيفة الفارغة القديمة الجيدة تعمل بشكل جيد في مثل هذه الحالات.

منذ 8 سنوات

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

سلسلة $ =<<

أربعون ماذا؟
جو
جين

أعلم أن هذا هو الجواب، ولكن ما هو السؤال؟




XML؛

$xml = simplexml_load_string ($string);
$xml -> RegisterXPathNamespace("def" , "http://www.w3.org/2005/Atom");

$nodes = $xml -> xpath ("//def:document/def:title" );

?>

منذ 9 سنوات

على الرغم من أن SimpleXMLElement يدعي أنه قابل للتكرار، إلا أنه لا يبدو أنه ينفذ وظائف واجهة Iterator القياسية مثل::next و::reset بشكل صحيح. لذلك، أثناء عمل foreach()، لا يبدو أن الوظائف مثل next() أو current() أو every() تعمل كما تتوقع - لا يبدو أن المؤشر يتحرك أبدًا أو يستمر في إعادة التعيين.

منذ 6 سنوات

إذا كان ترميز مستند XML ليس UTF-8، فيجب أن يظهر إعلان الترميز مباشرة بعد الإصدار = "..." وقبل المستقل = "...". هذا هو أحد متطلبات معيار XML.

إذا كان ترميز مستند XML يختلف عن UTF-8. يجب أن يتبع إعلان التشفير مباشرةً بعد الإصدار = "..." وقبل الإصدار المستقل = "...". هذا المتطلب هو XML القياسي.


نعم

اللغة الروسية. اللغة الروسية


خطأ فادح: استثناء لم يتم اكتشافه "استثناء" مع الرسالة "تعذر تحليل السلسلة كـ XML" في...

الآن سوف ندرس العمل مع XML.

XML هو تنسيق لتبادل البيانات بين المواقع.

إنه مشابه جدًا لـ HTML، لكن XML يسمح بعلاماته وسماته الخاصة.

لماذا هناك حاجة إلى XML للتحليل؟ يحدث أحيانًا أن يحتوي الموقع الذي تحتاج إلى تحليله على واجهة برمجة التطبيقات (API) التي يمكنك من خلالها الحصول على ما تريد دون بذل الكثير من الجهد.

لذلك، مجرد نصيحة - قبل تحليل الموقع، تحقق مما إذا كان يحتوي على واجهة برمجة التطبيقات (API).

ما هي واجهة برمجة التطبيقات؟ هذه مجموعة من الوظائف التي يمكنك من خلالها إرسال طلب إلى هذا الموقع وتلقي الرد المطلوب. تأتي هذه الإجابة غالبًا بتنسيق XML. لذلك دعونا نبدأ في دراستها.:

العمل مع XML في PHP لنفترض أن لديك XML. يمكن أن يكون في سلسلة، أو مخزنًا في ملف، أو يتم تقديمه عند الطلب إلى عنوان URL محدد. 25 1000 دع XML يتم تخزينه في سلسلة. في هذه الحالة، تحتاج إلى إنشاء كائن من هذه السلسلة باستخدام

عنصر SimpleXMLE جديد $ستر = "كوليا

"; $xml = new SimpleXMLElement($str); الآن لدينا في المتغير$xml $ستر = ":

لنفترض أن لديك XML. يمكن أن يكون في سلسلة، أو مخزنًا في ملف، أو يتم تقديمه عند الطلب إلى عنوان URL محدد. 25 1000

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

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

simplexml_load_file

، مما يجعل نفس الكائن

لنفترض أن لديك XML. يمكن أن يكون في سلسلة، أو مخزنًا في ملف، أو يتم تقديمه عند الطلب إلى عنوان URL محدد. 25 1000

$xml = simplexml_load_file(مسار الملف أو عنوان URL);

أساليب العمل

في الأمثلة أدناه، يتم تخزين ملف XML الخاص بنا في ملف أو عنوان URL.

دع XML التالي يعطى: دعنا نحصل على اسم الموظف وعمره وراتبه: $xml = simplexml_load_file(مسار الملف أو عنوان URL); صدى $xml->name; // سيتم عرض "Kolya" echo $xml->age; // سيُخرج 25 صدى $xml->salary; // سوف يخرج 1000

لنفترض أن لديك XML. يمكن أن يكون في سلسلة، أو مخزنًا في ملف، أو يتم تقديمه عند الطلب إلى عنوان URL محدد. 25 1000

أساليب العمل

كما ترون، يحتوي كائن $xml على خصائص تتوافق مع العلامات. ربما لاحظت أن العلامة

لا يظهر في أي مكان في الاستئناف.

لنفترض أن لديك XML. يمكن أن يكون في سلسلة، أو مخزنًا في ملف، أو يتم تقديمه عند الطلب إلى عنوان URL محدد. 25 1000

هذا لأنه هو العلامة الجذر.

يمكنك إعادة تسميته، على سبيل المثال، إلى

العمل مع السمات

السماح بتخزين بعض البيانات في السمات:

رقم 1

$xml = simplexml_load_file(مسار الملف أو عنوان URL); echo $xml->worker["name"]; // سيتم عرض "Kolya" echo $xml->worker["age"]; // سيُخرج 25 echo $xml->worker["salary"]; // سيُخرج 1000 echo $xml->worker; // سيتم عرض "الرقم 1"

العلامات مع الواصلات

يسمح XML بالعلامات (والسمات) بواصلة. في هذه الحالة، يتم الوصول إلى هذه العلامات على النحو التالي:

لنفترض أن لديك XML. يمكن أن يكون في سلسلة، أو مخزنًا في ملف، أو يتم تقديمه عند الطلب إلى عنوان URL محدد. إيفانوف

$xml = simplexml_load_file(مسار الملف أو عنوان URL); echo $xml->worker->(first-name); // سيتم عرض "Kolya" echo $xml->worker->(last-name); // سيتم عرض "إيفانوف"

حلقات

دعونا الآن ليس لدينا موظف واحد، بل عدة موظفين.

لنفترض أن لديك XML. يمكن أن يكون في سلسلة، أو مخزنًا في ملف، أو يتم تقديمه عند الطلب إلى عنوان URL محدد. 25 1000 في هذه الحالة، يمكننا التكرار على الكائن باستخدام حلقة foreach: 26 2000 فاسيا 27 3000

بيتيا

$xml = simplexml_load_file(مسار الملف أو عنوان URL); foreach ($xml كـ $worker) ( echo $worker->name; // سيعرض "Kolya"، "Vasya"، "Petya" )

من الكائن إلى المصفوفة العادية

إذا لم تكن مرتاحًا للعمل مع الكائن، فيمكنك تحويله إلى مصفوفة PHP عادية باستخدام الحيلة التالية:

$xml = simplexml_load_file(مسار الملف أو عنوان URL); var_dump(json_decode(json_encode($xml), true));

مزيد من المعلومات

التحليل يعتمد على sitemap.xml

غالبًا ما يحتوي الموقع على ملف sitemap.xml.

يقوم هذا الملف بتخزين الروابط لجميع صفحات الموقع لتسهيل فهرستها بواسطة محركات البحث (الفهرسة هي في الأساس تحليل للموقع بواسطة Yandex وGoogle).

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

كيفية التحقق من وجود هذا الملف: دعنا نحلل الموقع site.ru، ثم انتقل إلى site.ru/sitemap.xml في المتصفح - إذا رأيت شيئًا ما، فهو موجود، وإذا لم تراه، ثم للأسف.

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

ونتيجة لذلك، تحصل على قائمة من الروابط للتحليل، كل ما عليك فعله هو الذهاب إليها وتحليل المحتوى الذي تحتاجه.

اقرأ المزيد عن جهاز sitemap.xml على ويكيبيديا.

ماذا يجب أن تفعل بعد ذلك:


ابدأ بحل المسائل باستخدام الرابط التالي: مسائل الدرس.

سأعرض في هذه المقالة مثالاً لكيفية تحليل ملف 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 ($محلل، $name)
{
طباعة اسم $؛
}
############################################

($xml_parser، "بيانات")؛

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

$perviy_vxod = 1 ; بيانات $ = "" ;



{

$simvol = fgetc ($fp); $data .= $simvol ;


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


صدى "

حالة "الإبهام":
}

بيانات $ = "" ;
}
fClose($fp);

Webi_xml("1.xml");

?>

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

لنفترض أن محتويات الملف 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, true);

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

xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser، "بيانات")؛

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

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

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

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

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

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

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

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

بعد ذلك، تتم معالجة بيانات العلامة المفتوحة بواسطة الوظيفة البيانات (محلل، $بيانات)
سيحتوي المتغير $data على كل ما هو موجود بين علامتي الفتح والإغلاق، وفي حالتنا هذا هو النص Muka

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

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

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

الدالة webi_xml (ملف ($)
{
عالمي $webi_deepth؛ // عداد لتتبع عمق التداخل
$webi_عمق = 0 ;
عالمي $webi_tag_open؛ // سيحتوي على مجموعة من العلامات المفتوحة حاليًا
$webi_tag_open = array();
عالمي $webi_data_temp؛ // ستحتوي هذه المصفوفة على بيانات علامة واحدة

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

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

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




" ;

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


" ;

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

// الآن يتم فتح العلامة التالية وسيتم إجراء المزيد من المعالجة في الخطوة التالية
$webi_عمق++; // زيادة التداخل

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

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

#################################################
## وظيفة علامة الإغلاق
وظيفة endElement ($محلل، $name) (
عالمي $webi_ Deep ;
عالمي $webi_tag_open؛
عالمي $webi_data_temp؛

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

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


" ;

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

$webi_عمق --; // تقليل التداخل
}
############################################

$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);

// يشير إلى الوظائف التي ستعمل عند فتح العلامات وإغلاقها
xml_set_element_handler($xml_parser, "startElement", "endElement");

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

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

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

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

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

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

// الآن قم برمي البيانات في محلل XML
إذا (! 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_عمق" ]);
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 الحد الأقصى لوقت التنفيذ 6000

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

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

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