زنگ

کسانی هستند که این خبر را قبل از شما می خوانند.
برای دریافت آخرین مقالات مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید The Bell را بخوانید
بدون اسپم

امروز تصمیم گرفتم موضوع کار با XML-RPC را در وردپرس کمی ادامه دهم. همانطور که معمولاً برای من اتفاق می افتد ، این ایده در لحظه خواندن یک وبلاگ تصادفی به وجود آمده است ، من تصمیم گرفتم به کار با پست های وبلاگ بپردازم و در عین حال سعی کنم چیزی متناسب با نیازهای خود بنویسم.

به طور طبیعی ، من امروز برنامه ارسال نمی کنم ، اما برخی محاسبات ، لیست ها و ایده ها در پست حضور خواهند داشت.

من به طور خلاصه کار را با XML-RPC در پست مرور کردم "" امروز ما سعی خواهیم کرد که در کار خود به جلو برویم و از چندین روش متصل به هم برای گرفتن اطلاعات خاص از وبلاگ استفاده خواهیم کرد.

ما بطور مشخص هدف امروز: شما باید با استفاده از روشهای موجود از API وردپرس داده های مربوط به پست های وبلاگ را بدست آورید.

برای رسیدن به این هدف ، به ماژول های دلفی زیر نیاز داریم: XMLIntf , xmldom , XMLDoc و کتابخانه سیناپس یا جزء IDHTTP را Indy کنید (به هر کس که شما می خواهم)

1. آزمایش اتصال به وبلاگ.

من معتقدم اولین کاری که باید انجام دهید اینست که بررسی کنید که وبلاگ به درستی کار می کند برای خطاهای احتمالی زیر:

  1. این وبلاگ امکان استفاده از XML-RPC را غیرفعال کرده است
  2. کاربر داده های نادرست (url ، نام کاربری یا رمز عبور) را در اختیار کاربر قرار داد.

برای بررسی امکان کار با XML-RPC در یک وبلاگ ، فقط از این روش استفاده کنید demo.sayHello... اگر جواب خط است "سلام"، سپس همه چیز درست است و می توانید به مرحله بعدی چک ادامه دهید. برای انجام این بررسی ، ما باید سه کار ساده را انجام دهیم:

  • یک سند XML معتبر تولید کنید
  • درخواستی را به سرور بفرستید و پاسخ دهید
  • جواب را تحلیل کنید

ما یک سند XML را تشکیل می دهیم که باید به صورت زیر باشد:

demo.sayHello تست

برای انجام این کار ، ما از رابط IXMLDocument استفاده خواهیم کرد:

[...] var doc: IXMLDocument؛ // ریشه سند: IXMLNode؛ // گره ریشه شروع می شود وراثت ایجاد؛ doc: \u003d NewXMLDocument ()؛ // ایجاد یک سند خالی ریشه: \u003d Doc. CreateElement ("MethodCall" ، "")؛ // اضافه کردن گره ریشه دکتر DocumentElement: \u003d Root؛ ریشه AddChild ("متد نام"). NodeValue: \u003d "demo.sayHello"؛ // اضافه کردن نام روش ریشه AddChild ("پارامترها"). AddChild ("پارامتر"). AddChild ("مقدار"). AddChild ("رشته"). NodeValue: \u003d "تست"؛ // پارامترهای روش نوشتن [ ... ]

از آنجا که خود سند XML بسیار ساده است ، من آزادی کمی "انجماد" را گرفتم و با آخرین خط کد ، تمام گره ها و مقدار تنها پارامتر را برای روش خود به طور همزمان نوشتم.
اکنون می توانید سند را به سرور ارسال کرده و پاسخی دریافت کنید:

[...] با THTTPSend. Doc را شروع کنید. SaveToStream (سند)؛ // ارسال سند به بدنه درخواست اگر HTTPMethod ("POST" ، aURL) شروع شود // درخواست با موفقیت ارسال شد و پاسخی دریافت کرد پایان دیگر شروع می شود // درخواست انجام نشد پایان؛ پایان؛ [...]

درباره چی دوست دارم سیناپسبنابراین این بدان معنی است که از نظر پر کردن هدر ، "حرکت بدن" غیر ضروری نیست طول محتوا, نوع محتوا و غیره. البته ، هیچ کس زحمت ندارد تمام عناوین ممکن را خودتان پر کند ، اما شما می توانید همانطور که در بالا نشان دادم این کار را انجام دهید - همه چیز به صورت خودکار است.
حرکت ، تجزیه و تحلیل پاسخ.
بگذارید این را به شما یادآوری کنم ارسال موفقیت آمیز درخواست به سرور به این معنی نیست که ما با موفقیت به XML-RPC وبلاگ دسترسی پیدا کردیم. موفقیت آمیز درخواست فقط نشان می دهد که ما درخواستی ارسال کرده ایم و پاسخی دریافت کرده ایم ، اما نمی دانیم چه پاسخی وجود دارد یا نه..
برای اینکه در حال حاضر با روش ها و روش های غیر ضروری تجزیه تحلیل سرور خسته نشوید ، در این مورد پیشنهاد می کنم که از استفاده از یک چک ساده متوقف شوید:

[...] Doc LoadFromStream (سند ، xetUTF_8)؛ // یک سند XML نوشت اگر Doc DocumentElement ChildNodes FindNode ("گسل") \u003d صفر و ShowMessage ( "XML-RPC به درستی کار می کند") [ ... ]

با توجه به مشخصات XML-RPC ، پیام های خطا در یک گره به نام خطا قرار دارند. بنابراین ، در مورد ما ، کافی است وجود چنین گره ای را در سند XML پاسخ نشان دهیم - اگر در آنجا نباشد ، پس از آن تأیید موفقیت آمیز بود ، یک درخواست صحیح ایجاد شد و XML-RPC به درستی کار می کند.
حرکت به مرحله بعدی - بررسی صحت اطلاعات ارائه شده توسط کاربر و توانایی کاربر برای کار با وبلاگ XML-RPC.
فقط سرپرست می تواند با XML-RPC وبلاگ کار کند ، بنابراین ، لازم است بدانید که چه کسی در تلاش برای دستیابی به دسترسی است. برای این کار از روش استفاده می کنیم wp.getUsersBlogs... پارامترهای روش ورود به سیستم و رمز عبور هستند.
اما قبل از شروع ارسال درخواست و دریافت پاسخ ، فکر می کنم ارزش دارد که کمی در مورد آینده فکر کنیم و زمینه کار با خطاها ، تولید اسناد و غیره را فراهم کنیم.
در بررسی قبلی ، شاید بتوان گفت ، دلسردی وجود داشته است - ساده ترین نسخه کار از نوع:
فرستاده شده / دریافت شده / here_zhe_disassembled / فراموش شده / رفت_ بعدا.
از آنجا که من قصد دارم در آینده ماژول کار با API وردپرس را توسعه دهم ، منطقی است که در مورد نکات زیر در کار تصمیم گیری کنید:

  1. "اسکلت" سند را تشکیل دهید
  2. با در نظر گرفتن انواع داده ها ، تمام پارامترهای لازم را در سند بنویسید
  3. درخواست ارسال کنید و پاسخی را از سرور دریافت کنید
  4. پاسخ را تجزیه و تحلیل کنید و اگر پاسخ حاوی یک پیام خطا است ، آن را به درستی بخوانید

من این چهار مرحله را به عنوان روش کلاس جداگانه انجام دادم. منظور از "اسکلت" سند ، منظور از مطالب زیر است:

نام متد

یعنی بخشی از سند حاوی نام روش و گره پارامترها بی محتوا. علاوه بر این ، فقط پر کردن صحیح لیست پارامترها باقی مانده است. کاری که اکنون می خواهیم انجام دهیم.

در کل ، XML-RPC استفاده از شش نوع داده ساده را فراهم می کند:

  1. int و i4 عدد صحیح هستند)
  2. اعداد دو برابر -
  3. رشته - رشته ها
  4. base64 - رشته رمزگذاری شده
  5. dateTime.iso8601 - تاریخ / زمان
  6. بول

ما یک نوع داده جدید را شروع می کنیم:

TSimpleType \u003d (tsInt، tsI4، tsString، tsDouble، tsDateTime، tsBase64، tsBoolean)؛

با استفاده از مقادیر این نوع ، تگ را برای مقدار پارامتر تعریف خواهیم کرد.

از آنجا که عملیات ایجاد "اسکلت" یک سند و اضافه کردن پارامترهای روش توسط توابع مختلف از هم جدا می شوند ، یک نوع داده کمکی دیگر ایجاد خواهیم کرد:

PXMLDocument \u003d ^ IXMLDocument؛

اکنون روش اضافه کردن پارامتر به خود سند:

روش TBlog. SetParam (SimpleType: TSimpleType؛ مقدار: رشته؛ سند: PXMLDocument)؛ var Root: IXMLNode؛ اگر مستند ^ شروع شود. IsEmptyDoc سپس Exit؛ // سند خالی است Root: \u003d Doc ^. DocumentElement ChildNodes FindNode ("پارامترها")؛ اگر Root \u003d nil و سپس Exit؛ // گره مورد SimpleType از tsInt: Root یافت نشد. AddChild ("پارامتر"). AddChild ("مقدار"). AddChild ("int"). NodeValue: \u003d مقدار؛ tsI4: ریشه. AddChild ("پارامتر"). AddChild ("مقدار"). AddChild ("i4"). NodeValue: \u003d مقدار؛ tsString: ریشه. AddChild ("پارامتر"). AddChild ("مقدار"). AddChild ("رشته"). NodeValue: \u003d مقدار؛ tsDouble: ریشه. AddChild ("پارامتر"). AddChild ("مقدار"). AddChild ("دو برابر"). NodeValue: \u003d مقدار؛ tsDateTime: Root. AddChild ("پارامتر"). AddChild ("مقدار"). AddChild ("dateTime.iso8601"). NodeValue: \u003d مقدار؛ tsBase64: ریشه. AddChild ("پارامتر"). AddChild ("مقدار"). AddChild ("base64"). NodeValue: \u003d مقدار؛ tsBoolean: ریشه. AddChild ("پارامتر"). AddChild ("مقدار"). AddChild ("boolean"). NodeValue: \u003d مقدار؛ پایان؛ پایان؛

این روش فقط برای یک نوع رکورد ساده کار می کند. هنگام کار با سازه ها ، لازم است الگوریتم را اصلاح کنید.

اکنون در مورد تجزیه و تحلیل پیام های خطا. بیایید به مثالی از اینکه چگونه یک پیام خطا در XML-RPC به نظر می رسد نگاه کنیم:

faultCode 403 faultString ترکیب ورود به سیستم / پاس بد.

پیام خطا در ساختار به دست ما می رسد. علاوه بر این ، اگر فرض کنیم که برچسب ها عضواز صفر شماره گذاری می شود ، سپس هر یک از عناصر سازه یک کد خطا است و یک متن متن خطا است. از این رو ممکن است روش رسیدگی به پیام های خطا اینگونه باشد:

عملکرد TBlog. ParseErrors (aDocument: PXMLDocument): TStringList؛ var i: عدد صحیح؛ لیست: IDOMNodeList؛ کد: رشته؛ شروع لیست: \u003d aDocument ^. DOMDocument. getElementsByTagName ("عضو")؛ نتیجه: \u003d TStringList. ايجاد كردن؛ برای من: \u003d 0 به لیست. طول - 1 do do Case i mod 2 از 0: code: \u003d (لیست آیتم [i]. LastChild. firstChild as IDOMNodeEx). متن؛ // حتی عنصر - کد خطا را بخوانید 1 : // عنصر عجیب - متن خطا را بخوانید و نتیجه را بنویسید نتیجه اضافه کردن (کد + "" + (لیست. مورد [i]. LastChild. FirstChild به عنوان IDOMNodeEx). متن)؛ پایان؛ پایان؛ پایان؛

در اینجا کد خطا و متن برای TStringList نوشته شده است. من فکر می کنم در صورت لزوم می توانید به راحتی کد و متن را در لیست ها یا آرایه های مختلف بخوانید. ما هنوز به آن احتیاج نداریم

ما قبلاً ارسال سند را در نظر گرفته ایم ، بنابراین بلافاصله روشی را برای بررسی صحت داده ها ارائه می دهم:

عملکرد TBlog. CheckUserAccess (const aURL ، AUser ، aPassword: string؛ var Error: string): boolean؛ var Doc: IXMLDocument؛ شروع Doc: \u003d GetDocument ("wp.getUsersBlogs")؛ // ایجاد "اسکلت" // اضافه کردن پارامترها SetParam (tsString ، aUser ، @ Doc)؛ SetParam (tsString ، aPassword ، @ Doc)؛ SendQuery (@ Doc ، AURL)؛ // ارسال درخواست اگر نه Doc IsEmptyDoc سپس // اگر سند به درستی نوشته شده باشد اگر Doc شروع کنید. DocumentElement ChildNodes FindNode ("گسل") ‹پس از آن // یک پیام خطا وجود دارد شروع نتیجه: \u003d false؛ خطا: \u003d ParseErrors (@ Doc). رشته ها [0]؛ end other نتیجه: \u003d true؛ end other نتیجه: \u003d false؛ پایان؛

اگر پیام خطایی دریافت شده است ، آنگاه پیام را به متغیر Error بنویسید. در این حالت ، ساختار فقط یک پیام خطا دارد - به همین دلیل من آن را به راحتی نوشتم:

خطا: \u003d ParseErrors (@ Doc). رشته ها [0]؛

بنابراین ، دو بررسی انجام شده است و ما مشخص کرده ایم که XML-RPC فعال و درست کار می کند ، و کاربر وارد اطلاعات درست ورود و رمز عبور شده است و می تواند با API وردپرس کار کند. بعد چی؟ و سپس کار اصلی را شروع می کنیم - در وبلاگ اطلاعات مربوط به نظرات را بدست می آوریم.

2. اطلاعات مربوط به پست های وبلاگ را بدست آورید.

بنابراین ، وردپرس در اختیار ماست. اول ، اجازه دهید روش ها را از xmlrpc.php به طور خلاصه مرور کنیم.

wp.getPostStatusList - مقادیر وضعیت پست را نمایش می دهد. در واقع ، خروجی چهار خط خواهد داشت: "پیش نویس" ، "در حال انتظار" ، "خصوصی" ، "منتشر".

در حالی که این روش برای ما بی فایده است.

blogger.getRecentPosts - این ویژگی در حال حاضر از API Blogger است ، اما در WordPress پشتیبانی می شود. خروجی آخرین ارسال های وبلاگ از جمله محتوای پست خواهد بود.

می توانید از روش استفاده کنید ، اما کار برنامه کاهش می یابد زیرا مجبورید کل پست را در وب بکشید. و اگر سعی کنیم لیستی از پست های وبلاگ را به طور کامل بدست آوریم ، ظاهراً باید بدون انتظار نتیجه به رختخواب برویم. بنابراین ، ما این روش را فعلاً کنار می گذاریم.

metaWeblog.getRecentPosts - مشابه روش قبلی.

mt.getRecentPostTitles - روش از API MovableType. قضاوت بر اساس نام - آنچه ما نیاز داریم. توضیحات روش را مشاهده کنید.

این روش لیستی را با عناوین پست های وبلاگ برمی گرداند. در این حالت ، محتوا به لیست نوشته نمی شود.

پارامترهای ورودی:

  • رشته وبلاگ
  • نام کاربری رشته
  • رمز عبور رشته
  • int intOOPosts

وبلاگ همیشه 1 (توضیحات را در xmlrpc.php ببینید)

شمارهOfPosts - تعداد ارسال های ذکر شده اگر پارامتر مقدار بیشتری از تعداد ارسال های وبلاگ داشته باشد ، در این روش لیستی از تمام ارسال ها برمی گردد.

باقی مانده است که دریابیم این لیست چیست. و در خروجی آرایه ای از ساختارها خواهیم داشت که شامل موارد زیر است:

  • تاریخ ایجاد مورد
  • شناسه کاربر
  • پست
  • عنوان.

عالی ما از این روش استفاده خواهیم کرد و در عین حال نحوه تجزیه و تحلیل ساختارهای پاسخ پیچیده را نیز یاد خواهیم گرفت.

فکر نمی کنم ارزش ایجاد یک درخواست را داشته باشد. این روش مشابه روش فوق است. بیایید به تفصیل به تحلیل پاسخ سرور بپردازیم. ما هنگام تجزیه و تحلیل پاسخ حاوی یک خطای مجوز ، نحوه ساختار به نظر می رسد. بیایید ببینیم آرایه چیست.

آرایه ها نامی ندارند و با برچسب توصیف می شوند ... این شامل یک مورد است و یک یا چند کودک جایی که داده ها تنظیم شده اند هر نوع دیگری به هر ترتیب و همچنین سایر آرایه ها می توانند به عنوان عناصر آرایه عمل کنند - که به شما امکان می دهد آرایه های چند بعدی را توصیف کنید. همچنین می توانید مجموعه ای از ساختارها را توصیف کنید. به عنوان مثال ، آرایه ای از چهار عنصر مانند این است:

34 سلام دنیا! 0 -34

در خروج ما از روش mt.getRecentPostTitles
شامل خواهد شد مجموعه سازه ها، و یک ساختار اطلاعات برای یک پست وبلاگ است. بنابراین ، خواندن داده ها در پست های وبلاگ می تواند تقریباً به مراحل زیر تقسیم شود:

  1. تمام عناصر را از سند XML استخراج کنید ... بچه اول. childNodes؛ // همه اعضا را برای 1 مقدار بدست آورد برای j: \u003d 0 به اعضا. طول - 1 انجام می شود با نتیجه [i] do j از 0: dateCreated: \u003d (اعضا [j]. LastChild. اول فرزندان به عنوان IDOMNodeEx). متن؛ 1: user_id: \u003d StrToInt ((اعضا [j]. LastChild. اول کودک به عنوان IDOMNodeEx). متن)؛ 2: id: \u003d StrToInt ((اعضا [j]. LastChild. اول کودک به عنوان IDOMNodeEx). متن)؛ 3: عنوان: \u003d (اعضا [j]. LastChild. اول کودک به عنوان IDOMNodeEx). متن؛ پایان؛ پایان؛ پایان؛ [...]

    بر این اساس ، اگر پیام خطایی دریافت شده است ، می توانید از عملکرد قبلاً مورد بحث استفاده کنید.

    برای امروز کافی است. دفعه بعد کار خود را با API ادامه خواهیم داد و سعی خواهیم کرد که همه نظرات را از وبلاگ دریافت کنیم.

XML به طور فزاینده ای برای ذخیره اطلاعات و تبادل آن بین برنامه ها و وب سایت ها مورد استفاده قرار می گیرد. بسیاری از برنامه ها از این زبان به عنوان زبان اصلی برای ذخیره داده استفاده می کنند ، در حالی که برخی دیگر از آن برای صادرات و وارد کردن داده های XML استفاده می کنند. بنابراین زمان آن فرا رسیده است که توسعه دهندگان در مورد چگونگی استفاده از داده های XML در برنامه های خودشان فکر کنند.

در این مقاله ، ما به بررسی XML Object Model Object (DOM) و اجرای مایکروسافت از XML DOM خواهیم پرداخت.

XML DOM یک الگوی شیئی است که اشیاء را برای بارگیری و پردازش فایل های XML در اختیار توسعه دهنده قرار می دهد. مدل شی شامل اشیاء اصلی زیر است: XMLDOMDocument ، XMLDOMNodeList ، XMLDOMNode ، XMLDOMNamedNodeMap و XMLDOMParseError. هر یک از این اشیاء (به جز XMLDOMParseError) شامل خواص و روشهایی است که به شما امکان می دهد اطلاعاتی راجع به شیء بدست آورید ، مقادیر و ساختار شیء را دستکاری کنید و به ساختار یک سند XML بروید.

بیایید به اشیاء اصلی XML DOM نگاهی بیندازیم و چند نمونه از کاربرد آنها در Borland Delphi را نشان دهیم.

استفاده از XML DOM در Borland Delphi

برای استفاده از Microsoft XML DOM در برنامه های Delphi ، باید کتابخانه نوع مناسب را به پروژه وصل کنید. برای این کار ، دستور Project | را اجرا می کنیم Import Type Library و در کادر گفتگوی Import Type Library ، کتابخانه Microsoft XML نسخه 2.0 (نسخه 2.0) را انتخاب کنید ، که معمولاً در پرونده Windows \\ System \\ MSXML.DLL قرار دارد.

پس از کلیک بر روی دکمه ایجاد واحد ، ماژول رابط MSXML_TLB ایجاد خواهد شد که به ما امکان استفاده از اشیاء XML DOM: DOMDocument ، XMLDocument ، XMLHTTPRequest و تعدادی دیگر را می دهد که در کتابخانه MSXML.DLL اجرا شده اند. مراجعه به ماژول MSXML_TLB باید در لیست Uses باشد.

دستگاه DOM XML

Document Object Model یک سند XML را به عنوان ساختار درخت شاخه ها نشان می دهد. XML DOM API برنامه ها را قادر می سازد تا از درخت سند حرکت کنند و شاخه های آن را دستکاری کنند. هر شاخه می تواند یک نوع خاص (DOMNodeType) داشته باشد ، که براساس آن شاخه های والدین و فرزند تعیین می شود. اکثر اسناد XML حاوی شاخه هایی از عنصر نوع ، ویژگی و متن هستند. ویژگی ها یک نوع خاص از شاخه ها هستند و شاخه های کودک نیستند. صفات با استفاده از روشهای ویژه ارائه شده توسط اشیاء XML DOM دستکاری می شوند.

علاوه بر اجرای کنسرسیوم جهانی وب گسترده (W3C) رابط های توصیه شده ، Microsoft XML DOM شامل روشهایی است که از XSL ، الگوهای XSL ، نام های فضایی و انواع داده ها پشتیبانی می کند. به عنوان مثال ، روش SelectNodes به شما امکان می دهد تا از XSL Pattern Syntax استفاده کنید تا شاخه ها را در یک زمینه خاص پیدا کنید ، و روش TransformNode با استفاده از XSL برای انجام تحولات پشتیبانی می کند.

تست سند XML

به عنوان یک سند XML ، یک فهرست موسیقی CD-ROM را بگیرید که ساختار زیر را دارد:

امپراطوری بورسیکل باب دیلان ایالات متحده آمریکا کلمبیا 10.90 1985 قلب خود را پنهان کنید بانی تیلور بریتانیا CBS Records 9.90 1988 ... قلبم را رها کن جو کوکر ایالات متحده آمریکا EMI 8.20 1987

اکنون ما با شروع از شی XMLDOMDocument آماده هستیم تا به بررسی مدل شی XML DOM بپردازیم.

XML سند - XMLDOMDocument Object

کار با یک سند XML با بارگیری آن آغاز می شود. برای این کار از روش Load استفاده می کنیم که فقط یک پارامتر دارد که URL سند بارگذاری شده را مشخص می کند. هنگام بارگیری پرونده ها از دیسک محلی ، فقط نام کامل پرونده مشخص می شود (پرونده: /// پروتکل در این حالت قابل حذف نیست). اگر سند XML به صورت رشته ذخیره می شود ، از روش LoadXML برای بارگیری آن سند استفاده کنید.

از ویژگی Async برای کنترل نحوه بارگیری اسناد استفاده می شود (همزمان یا ناهمزمان). به طور پیش فرض ، این ویژگی روی True تنظیم شده است ، نشان می دهد که سند به طور همزمان به صورت همزمان انجام شده است و کنترل قبل از بارگیری کامل سند به برنامه باز می گردد. در غیر اینصورت ، سند بارگیری همزمان می شود و سپس باید مقدار ویژگی ReadyState را بررسی کنید تا ببینید که این سند بارگذاری شده است یا خیر. همچنین می توانید یک کنترل کننده برای رویداد OnReadyStateChange ایجاد کنید که با تغییر مقدار ویژگی ReadyState کنترل را به دست خواهد آورد.

در زیر نحوه بارگیری یک سند XML با استفاده از روش Load نشان داده شده است:

موارد استفاده ... MSXML_TLB ... روش TForm1.Button1 کلیک (ارسال کننده: TObject)؛ var XMLDoc: IXMLDOMDocument؛ شروع XMLDoc: \u003d CoDOMDocument.Create؛ XMLDoc.Async: \u003d نادرست؛ XMLDoc.Load (‘C: \\ DATA \\ DATA.xml ')؛ // // // در اینجاست که کد // سند XML و شاخه های آن را دستکاری می کند // XMLDoc: \u003d Nil؛ پایان؛

پس از بارگیری سند ، می توانیم به خصوصیات آن دسترسی پیدا کنیم. بنابراین ، ویژگی NodeName حاوی مقدار #document خواهد بود ، خاصیت NodeTypeString حاوی مقدار سند خواهد بود ، و خاصیت URL حاوی پرونده خواهد بود: /// C: /DATA/DATA.xml.

خطا در مدیریت

مورد توجه ویژه ای خاصیت های مرتبط با پردازش اسناد هنگام بارگذاری آن است. به عنوان مثال ، ویژگی ParseError یک شی XMLDOMParseError را که حاوی اطلاعات مربوط به خطایی است که هنگام پردازش سند رخ داده است ، بازمی گرداند.

برای نوشتن کنترل کننده خطا می توانید کد زیر را اضافه کنید:

Var XMLError: IXMLDOMParseError؛ ... XMLDoc.Load (‘C: \\ DATA \\ DATA.xml ')؛ XMLError: \u003d XMLDoc.ParseError؛ اگر XMLError.ErrorCode<> 0 سپس // // در اینجا خطا را حل می کنیم // Else Memo1.Lines.Add (XMLDoc.XML)؛ ... XMLDoc: \u003d نیل؛

برای دیدن چه اطلاعاتی در صورت بروز خطا بازگردانده شده ، فهرست فهرست زیر را تغییر دهید:

امپراطوری بورسیکل باب دیلان ایالات متحده آمریکا کلمبیا 10.90 1985

حذف عنصر بسته شدن در خط دوم:</p><p> <CD> <TITLE>امپراطوری بورسیکل <ARTIST>باب دیلان</ARTIST> <COUNTRY>ایالات متحده آمریکا</COUNTRY> <COMPANY>کلمبیا</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>حال بیایید کدی بنویسیم که مقادیر خاصیت XMLDOMParseError شی را برگرداند:</p><p>XMLError: \u003d XMLDoc.ParseError؛ اگر XMLError.ErrorCode<> 0 سپس با XMLError ، Memo1.Lines شروع به افزودن (‘پرونده: + + URL) می کند. افزودن (‘کد: '+ IntToStr (ErrorCode))؛ اضافه کردن ("خطا:" + دلیل)؛ (‘متن: '+ SrcText) را اضافه کنید؛ اضافه کردن ("خط:" + IntToStr (خط))؛ اضافه کردن ("موقعیت:" + IntToStr (LinePos))؛ پایان Else Memo1.Lines.Add (XMLDoc.XML)؛ پایان؛</p><p>و برنامه ما را اجرا کنید در نتیجه ، در مورد خطا اطلاعات زیر را دریافت می کنیم.</p> <p>همانطور که از مثال بالا می بینید ، اطلاعاتی که توسط شی XMLDOMParseError بازگردانده شده اند برای بومی سازی خطا و درک علت وقوع آن کاملاً کافی هستند.</p> <p>اکنون عنصر بسته شدن را بازیابی خواهیم کرد <TITLE> در سند ما و بحث ما درباره XML DOM را ادامه دهید.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> دسترسی به درخت سند</h2> <p>برای دسترسی به درخت سند ، می توانید عنصر ریشه را بدست آورید و سپس در شاخه های کودک آن تکرار کنید ، یا یک شاخه خاص پیدا کنید. در حالت اول ، عنصر ریشه را از طریق ویژگی DocumentElement دریافت می کنیم ، که یک شیء از نوع XMLDOMNode را برمی گرداند. در اینجا نحوه استفاده از ویژگی DocumentElement برای به دست آوردن محتوای هر عنصر کودک آورده شده است:</p><p>گره Var: IXMLDOMNode؛ ریشه: IXMLDOMElement؛ من: علاقه؛ ... ریشه: \u003d XMLDoc.DocumentElement؛ برای I: \u003d 0 به Root.ChildNodes.L طول-1 انجام گره شروع: \u003d Root.ChildNodes.Item [I]؛ Memo1.Lines.Add (Node.Text)؛ پایان؛</p><p>برای سند XML ما متن زیر را دریافت می کنیم.</p> <p>اگر ما علاقه مند به یک شعبه خاص یا شاخه ای در زیر شاخه اول کودک هستیم ، می توانیم از روش NodeFromID یا روش GetElementByTagName از شی XMLDOMDocument استفاده کنیم.</p> <p>روش NodeFromID به یک شناسه منحصر به فرد نیاز دارد همانطور که در XML Schema یا Document Type Definition (DTD) تعریف شده است و به آن شاخه با آن شناسه باز می گردد.</p> <p>روش GetElementByTagName به یک رشته با یک عنصر خاص (برچسب) نیاز دارد و تمام شاخه ها را با این عنصر باز می گرداند. در اینجا نحوه استفاده از این روش برای یافتن همه هنرمندان در فهرست CD-ROM ما آمده است:</p><p>گره ها: IXMLDOMNodeList؛ گره: IXMLDOMNode؛ ... گره ها: \u003d XMLDoc.GetElementsByTagName ("ARTIST")؛ برای I: \u003d 0 تا Nodes.Length-1 do Node Start: \u003d Nodes.Item [I]؛ Memo1.Lines.Add (Node.Text)؛ پایان؛</p><p>برای سند XML ما متن زیر را دریافت خواهیم کرد</p> <p>توجه داشته باشید که روش SelectNodes از XMLDOMNode شیوه ای انعطاف پذیر تر برای دستیابی به شاخه های سند را ارائه می دهد. اما موارد زیر در ادامه</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> شعبه اسناد - XMLDOMNode Object</h2> <p>شی XMLDOMNode یک شاخه سند را نشان می دهد. ما قبلاً هنگام دریافت عنصر اصلی سند با این شیء روبرو شده ایم:</p><p>ریشه: \u003d XMLDoc.DocumentElement؛</p><p>برای به دست آوردن اطلاعات در مورد شاخه ای از یک سند XML ، می توانید از خصوصیات شی XMLDOMNode استفاده کنید (جدول 1).</p> <p>برای دسترسی به داده های ذخیره شده در یک شاخه ، معمولاً استفاده از ویژگی NodeValue (موجود برای ویژگی ها ، شاخه های متن ، نظرات ، دستورالعمل های پردازش و بخش های CDATA) یا خاصیت Text است که محتوای متن شعبه یا ویژگی NodeTypedValue را باز می گرداند. با این حال ، مورد دوم فقط برای شاخه هایی با موارد تایپ شده قابل استفاده است.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> پیمایش درخت سند</h3> <p>شی XMLDOMNode روشهای زیادی برای حرکت به درخت سند ارائه می دهد. به عنوان مثال ، برای دسترسی به شعبه والدین ، \u200b\u200bاز ویژگی ParentNode (نوع XMLDOMNode) ، دسترسی به شعب کودک از طریق خصوصیات ChildNodes (نوع XMLDOMNodeList) ، FirstChild و LastChild (نوع XMLDOMNode) و غیره استفاده کنید. ویژگی OwnerDocument یک شی XMLDOMDocument را که خود سند XML را مشخص می کند ، برمی گرداند. خواص ذکر شده در بالا ، امکان حرکت در درخت سند را آسان می کند.</p> <p>اکنون بیایید بیش از همه شاخه های سند XML تکرار کنیم:</p><p>ریشه: \u003d XMLDoc.DocumentElement؛ برای I: \u003d 0 به Root.ChildNodes.L طول-1 انجام گره شروع: \u003d Root.ChildNodes.Item [I]؛ اگر Node.HasChildNodes سپس GetChilds (گره ، 0)؛ پایان؛</p><p>همانطور که در بالا ذکر شد ، SelectNodes از XMLDOMNode شیوه انعطاف پذیر تری برای دسترسی به شاخه های سند ارائه می دهد. علاوه بر این ، یک روش SelectSingleNode وجود دارد که تنها شاخه اول سند را باز می گرداند. هر دو روش به شما امکان می دهند قالبهای XSL را برای جستجوی شعب تعریف کنید.</p> <p>بیایید روند استفاده از روش SelectNodes را برای واکشی در تمام شعبهایی که دارای یک شعبه سی دی و یک زیر شاخه PRICE هستند ، بررسی کنیم:</p><p>ریشه: \u003d XMLDoc.DocumentElement؛ گره ها: \u003d Root.SelectNodes ("CD / PRICE")؛</p><p>کلیه زیر شاخه های PRICE شعبه CD در مجموعه گره ها قرار می گیرد. ما کمی بعد به بحث در مورد الگوهای XSL باز خواهیم گشت.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> دستکاری شاخه های کودک</h3> <p>برای دستکاری در شاخه های کودک می توانیم از روشهای شی XMLDOMNode استفاده کنیم (جدول 2).</p> <p>برای حذف کامل پرونده در مورد دیسک اول ، باید کد زیر را اجرا کنید:</p><p>Var XMLDoc: IXMLDOMDocument؛ ریشه: IXMLDOMNode؛ گره: IXMLDOMNode؛ XMLDoc: \u003d CoDOMDocument.Create؛ XMLDoc.Async: \u003d نادرست؛ XMLDoc.Load (‘C: \\ DATA \\ DATA.xml ')؛ // ریشه عنصر ریشه را بدست آورید: \u003d XMLDoc.DocumentElement؛ گره: \u003d Root؛ // اولین شاخه کودک Node.RemoveChild (Node.FirstChild) را حذف کنید.</p><p>توجه داشته باشید که در این مثال اولین شاخه کودک را حذف می کنیم. نحوه حذف اولین عنصر اولین شاخه کودک در زیر آورده شده است:</p><p>Var XMLDoc: IXMLDOMDocument؛ ریشه: IXMLDOMNode؛ گره: IXMLDOMNode؛ XMLDoc: \u003d CoDOMDocument.Create؛ XMLDoc.Async: \u003d نادرست؛ XMLDoc.Load (‘C: \\ DATA \\ DATA.xml ')؛ // ریشه عنصر ریشه را بدست آورید: \u003d XMLDoc.DocumentElement؛ // و اولین شاخه کودک Node: \u003d Root.FirstChild؛ // اولین شاخه کودک Node.RemoveChild (Node.FirstChild) را حذف کنید.</p><p>در مثال بالا ، شاخه اول را حذف نکردیم <CD>…</CD>و اولین عنصر شعبه است <TITLE>….

حالا بیایید یک شاخه جدید اضافه کنیم. در زیر کد نشان می دهد که چگونه یک ورودی جدید CD-ROM موسیقی اضافه کنید:

Var NewNode: IXMLDOMNode؛ کودک: IXMLDOMNode؛ ... // ایجاد شعبه جدید - NewNode: \u003d XMLDoc.CreateNode (1 ، "CD" ، ")؛ // اضافه کردن یک عنصر فرزند: \u003d XMLDoc.CreateNode (1 ، "TITLE" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d "Pink Floyd"؛ // اضافه کردن یک عنصر <ARTIST> فرزند: \u003d XMLDoc.CreateNode (1 ، "ARTIST" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d "بخش زنگ"؛ // اضافه کردن یک عنصر <COUNTRY> فرزند: \u003d XMLDoc.CreateNode (1 ، "COUNTRY" ، ")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d "UK"؛ // اضافه کردن یک عنصر <COMPANY> فرزند: \u003d XMLDoc.CreateNode (1 ، "شرکت" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d "EMI Records Ltd."؛ // اضافه کردن یک عنصر <PRICE>فرزند: \u003d XMLDoc.CreateNode (1 ، "PRICE" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d '11 .99 "؛ // عنصری را اضافه کنید <YEAR> فرزند: \u003d XMLDoc.CreateNode (1 ، "YEAR" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن را Child تنظیم کنید. متن: \u003d ‘1994؛ // و یک شاخه Root.AppendChild (NewNode) اضافه کنید. ...</p><p>کد بالا مراحل زیر برای اضافه کردن یک شعبه جدید را نشان می دهد:</p> <ul><li>ایجاد یک شاخه جدید با استفاده از روش CreateNode: <ul><li>ایجاد یک عنصر با استفاده از روش CreateNode؛</li> <li>اضافه کردن یک عنصر به یک شاخه با استفاده از روش AppendChild؛</li> <li>مقدار یک عنصر را از طریق متن متن تنظیم کنید.</li> <li>… برای همه عناصر تکرار کنید.</li> </ul></li> <li>با استفاده از روش AppendChild یک شاخه جدید به سند اضافه کنید.</li> </ul><p>به یاد بیاورید که روش AppendChild شاخه ای به انتهای درخت اضافه می کند. به منظور اضافه کردن شاخه به یک مکان خاص در درخت ، باید از روش InsertBefore استفاده کنید.</p> <h2> مجموعه شعبه - شی XMLDOMNodeList</h2> <p>شیء XMLNodeList شامل لیستی از شعب است که می تواند با استفاده از روش های SelectNodes یا GetElementsByTagName ساخته شود ، و همچنین از ویژگی ChildNodes بدست می آید.</p> <p>قبلاً در مثال ارائه شده در بخش "پیمایش درخت سند" در مورد استفاده از این شیء بحث کرده ایم. در اینجا ما نیز برخی از نظرات نظری را ارائه خواهیم کرد.</p> <p>تعداد شعب موجود در لیست می تواند به عنوان مقدار خاصیت طول به دست آید. شاخه ها از 0 به طول - 1 فهرست بندی می شوند و هر شاخه جداگانه از طریق آیتم نمایه شده مربوطه در آرایه آیتم قابل دسترسی است.</p> <p>حرکت از طریق لیست شعب نیز می تواند با روش NextNode انجام شود ، که شاخه بعدی را در لیست برمی گرداند یا Nil اگر شاخه فعلی آخرین باشد. برای بازگشت به بالای لیست ، با روش Reset تماس بگیرید.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> اسناد را ایجاد و ذخیره کنید</h2> <p>بنابراین ، ما دیدیم که چگونه می توانید شاخه ها و عناصر را به اسناد XML موجود اضافه کنید. حالا بیایید یک سند XML را در پرواز ایجاد کنیم. اول از همه ، به یاد داشته باشید که یک سند می تواند نه تنها از URL ، بلکه از یک رشته معمولی بارگیری شود. موارد زیر نحوه ایجاد یک عنصر ریشه را نشان می دهد ، که می توان از آن برای ساخت پویا بقیه عناصر استفاده کرد (که قبلاً در بخش "دستکاری شاخه های کودک" آنها را پوشش داده ایم):</p><p>Var XMLDoc: IXMLDOMDocument؛ ریشه: IXMLDOMNode؛ گره: IXMLDOMNode؛ S: WideString؛ ... S: \u003d ‘ <CATALOG></CATALOG>'؛ XMLDoc: \u003d CoDOMDocument.Create؛ XMLDoc.Async: \u003d نادرست؛ XMLDoc.LoadXML (S)؛ ریشه: \u003d XMLDoc.DocumentElement؛ گره: \u003d XMLDoc.CreateNode (1 ، "CD" ، ")؛ Root.AppendChild (گره)؛ Memo1.Lines.Add (XMLDoc.XML)؛ ... XMLDoc: \u003d نیل؛</p><p>پس از ساختن سند XML ، آن را با استفاده از روش ذخیره در فایل ذخیره کنید. مثلا:</p> <p>XMLDoc.Save ('C: \\ DATA \\ NEWCD.XML')؛</p> <p>علاوه بر صرفه جویی در پرونده ، روش ذخیره به شما امکان می دهد تا یک سند XML را در یک شی جدید XMLDOMDocument ذخیره کنید. در این حالت ، سند کاملاً پردازش شده و در نتیجه ساختار و نحو آن بررسی می شود. در اینجا نحوه ذخیره یک سند در یک شی دیگر آمده است:</p><p>رویه TForm1.Button2Click (فرستنده: TObject)؛ var XMLDoc2: IXMLDOMDocument؛ شروع XMLDoc2: \u003d CoDOMDocument.Create؛ XMLDoc.Save (XMLDoc2)؛ Memo2.Lines.Add (XMLDoc2.XML)؛ ... XMLDoc2: \u003d نیل؛ پایان؛</p><p>در پایان ، روش ذخیره همچنین به شما امکان می دهد تا سند XML را در سایر اشیاء COM که از رابط های IStream ، IPersistStream یا IPersistStreamInit پشتیبانی می کنند ، ذخیره کنید.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> با استفاده از الگوهای XSL</h2> <p>در بحث در مورد روش SelectNodes از شی XMLDOMNode ، ما ذکر کردیم که روشی انعطاف پذیرتر برای دستیابی به شاخه های سند ارائه می دهد. انعطاف پذیری این است که می توانید یک الگوی XSL را به عنوان معیار انتخاب شعب مشخص کنید. چنین قالب هایی مکانیزم قدرتمندی برای یافتن اطلاعات در اسناد XML ارائه می دهند. به عنوان مثال ، برای دریافت لیستی از تمام عناوین موسیقی CD-ROM در فهرست ما ، می توانید پرس و جو زیر را اجرا کنید:</p><p>برای اطلاع از اینکه دیسک های هنرمندان در ایالات متحده آزاد شدند ، درخواست به شرح زیر است:</p><p>گره ها: \u003d Root.SelectNodes ("CD / ARTIST")؛</p><p>در اینجا نحوه یافتن اولین درایو در یک فهرست آمده است:</p><p>گره ها: \u003d Root.SelectNodes ("CD / TITLE")؛</p><p>و بالاخره:</p><p>گره ها: \u003d Root.SelectNodes ("CD / TITLE")؛</p><p>برای یافتن دیسک های باب دیلن ، می توانید پرس و جو زیر را اجرا کنید:</p><p>گره ها: \u003d Root.SelectNodes (‘CD [$ هر $ ARTIST \u003d" Bob Dylan "] / TITLE")؛</p><p>و برای بدست آوردن لیستی از دیسک های ساخته شده پس از 1985 ، ما پرس و جو زیر را اجرا می کنیم:</p><p>گره ها: \u003d Root.SelectNodes ("CD / TITLE")؛</p><p>بحث مفصل تر درباره نحو XSL نیاز به یک انتشار جداگانه دارد. برای فریب خوانندگان و تشویق تحقیقات بیشتر ، فقط یک مثال کوچک از استفاده احتمالی XSL را بیان می کنم. بیایید بگوییم که باید فروشگاه خود را به یک جدول HTML معمولی تبدیل کنیم. با استفاده از روش های سنتی ، باید بیش از همه شاخه های درخت تکرار شویم و برای هر عنصر دریافت شده ، برچسب های مربوطه را تشکیل دهیم <TD>…</TD>.</p> <p>با استفاده از XSL ، ما به سادگی یک الگوی (یا شیوه نامه) ایجاد می کنیم که مشخص می کند چه چیزی و چطور می توان آن را تغییر داد. سپس ما این الگوی را در فهرست خود قرار می دهیم - و این همان است: ما متن قالب XSL را داریم که کاتالوگ را به یک جدول تبدیل می کند (لیست 2).</p> <p>کد برای پوشش یک الگوی XSL در فهرست ما به این شرح است:</p><p>رویه TForm1.Button2Click (فرستنده: TObject)؛ var XSLDoc: IXMLDOMDocument؛ شروع XSLDoc: \u003d CoDOMDocument.Create؛ XSLDoc.Load (‘C: \\ DATA \\ DATA.xsl ')؛ Memo2.Text: \u003d XMLDoc.TransformNode (XSLDoc)؛ XSLDoc: \u003d نیل؛ پایان؛</p><p>نتیجه گیری از بحث ما در مورد XSL ، باید گفت که در حال حاضر این زبان بطور فعال برای انتقال بین اسناد مختلف XML و همچنین برای قالب بندی اسناد استفاده می شود.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> نتیجه</h2> <p>به دلایل واضح ، پوشاندن کلیه اشیاء DOM Microsoft XML و ارائه نمونه هایی از کاربرد آنها در یک مقاله غیرممکن است. در اینجا ما فقط به موارد اساسی استفاده از XML DOM در برنامه ها پرداختیم. جدول 3 همه اشیاء اجرا شده در Microsoft XML DOM را نشان می دهد.</p> <p>ComputerPress 12 "2000</p> <p>علیرغم اینکه موضوع کار با XML در دلفی به طور گسترده در اینترنت مورد بحث قرار گرفته است ، سؤالاتی در مورد این موضوع اغلب در انواع تالارهای مختلف مطرح می شود. <br></p><p>من این را هم نوشتم ، اما می خواهم به تجزیه واقعی فایل سریع XML و بازیابی داده هایی که امروز در محل کار خودم انجام داده ام ، به پرونده واقعی بازگردم. بیشتر 5 دقیقه طول کشید تا اطلاعات لازم را بدست آورم. <br></p><p>زمینه. امروز ما نیاز به پردازش داده ها در مورد برنامه های نصب شده بر روی رایانه های کاربران (بله ، بله ، ما در حال شناسایی دزدان دریایی هستیم :)) است. بخش فنی این اطلاعات را که از کاربران مظنون از طریق شبکه با استفاده از WMI برداشته شده بود ، در اختیار من قرار داد. برنامه ای که آنها استفاده کرده اند گزارشاتی را با فرمت XML تولید می کنند. بر این اساس ، آنها کوهی از فایلهای XML را با ساختار نسبتاً پیچیده برای من به ارمغان آوردند ، از این رو فقط باید نام محصولات نرم افزاری نصب شده را بیرون بیاورم. <br><span><br><p>رفتار . با نگاه کردن به چندین فایل دستی ، فهمیدم که پیر شدن زیاد طول نمی کشد ، و تصمیم گرفتم مبدل کوچکی بنویسم. با شروع دلفی ، شیء XML DataBinding را از مخزن انتخاب کردم و یکی از پرونده ها را از آن تغذیه کردم. من تمام تنظیمات و پارامترها را بطور پیش فرض رها کردم و در نتیجه ، برای دسترسی به عناصر این فایل XML ، یک ماژول با تعداد زیادی کلاس و رابط گرفتم. برای مدت طولانی زحمت نکشیدم که با ساختار کلاسها سر و کار دارم ، بلافاصله به نوشتن مبدل حرکت کردم. <br></p><p>در یک برنامه کنسول جدید ، من کد ساده ای نوشتم: <br></p> <br>برنامه XML2TXT؛</p><p>استفاده می کند <br> تشکیل می دهد، <br> کلاس ها ، SysUtils ، <br> SoftwareXML در "SoftwareXML.pas"؛</p><p>روش CovertXML2Text؛ <br>واری <br> softbase: IXMLSTDSoftwareType؛ <br> من: عدد صحیح؛ <br> sr: TSearchRec؛ <br> CurDir: رشته؛ <br> ExportFile: TStringList؛ <br>شروع <br> CurDir: \u003d IncludTrailingPathDelimiter (ExtractFilePath (Application.ExeName))؛ <br> اگر FindFirst (CurDir + "*. xml" ، faAnyFile ، sr) \u003d 0 باشد <br> تکرار <br> ExportFile: \u003d TStringList.Create؛ <br> softbase: \u003d LoadSTDSoftware (Pchar (CurDir + sr.Name))؛ <br> برای من: \u003d 0 به softbase.InstalledSoftware.source.software.Count - 1 انجام دهید <br> ExportFile.Add (softbase.InstalledSoftware.source.software [i] .DisplayName)؛ <br> ExportFile.Sort؛ <br> ExportFile.SaveToFile (CurDir + softbase.InstalledSoftware.Source.servername + ". Txt")؛ <br> ExportFile.Free؛ <br> تا FindNext (sr) 0؛ <br>پایان؛</p><p>شروع <br> Application.Initialize؛ <br> CovertXML2 متن؛ <br>پایان. <br></p><p>در نتیجه ، من یک ویرایشگر متن برای هر کامپیوتر در شبکه حاوی لیستی از نرم افزارهای نصب کردم. <br></p><p>احساس می کنم که این کد توضیحاتی را می خواهد. به عنوان مثال ، چرا از ماژول Forms در یک برنامه کنسول استفاده کردم و با Application.Initialize ؛ Procedure تماس گرفتم؟ <br></p><p>در واقع ساده است - این یک هک کوچک است که به شما امکان می دهد از XML Data Binding در یک برنامه کنسول استفاده کنید. زیرا سرسختانه از شروع کلاس برای کار با XML خودداری می کند. من هنوز دلایل واقعی را نمی فهمیدم - امروز زمان مهم بود ، من قبلاً 4 از 5 دقیقه را برای مبارزه با این خطا صرف کردم. :) من فکر می کنم بعداً با این مشکل کنار بیایید و بنویسید که دلیل واقعی چیست. <br></p><p>کلاس softbase عجیب از یک پرونده XML ایجاد شده است - نام این عنصر root است و softbase.InstalledSoftware.source.software [i]. <br></p><p>به این ترتیب یکی از سریعترین راههای کار با XML در دلفی به نظر می رسد. <br></p> <p>اخیراً توجه زیادی به ساخت سیستم های تجارت الکترونیکی شده است ، یا همانطور که به آنها نیز گفته می شود - B2B (تجارت به تجارت). با در نظر گرفتن توصیه های مربوط به ساخت سیستم های جریان مبادله از بدنه هماهنگ کننده فن آوری های اینترنتی - کنسرسیوم WWW: تأکید بر فناوری های XML و ساخت سیستم هایی برای تبادل اسناد XML است.</p> <p>مزیت استفاده از XML در مشاغل الکترونیکی ، راندمان بالای سیستم های B2B با هزینه کم برای ایجاد آن به دلیل ارائه واضح و بصری از اطلاعات ساختاری ، امکان استفاده از پروتکل های شبکه مدرن و ایجاد سیستم های تجاری در زمان واقعی است.</p> <p>استقلال ارائه اطلاعات در قالب اسناد XML به شرکت های مختلفی که در تجارت الکترونیکی شرکت می کنند ، اجازه می دهد تا نرم افزاری مستقل از یکدیگر تولید کنند.</p> <p>در کلیه سیستم ها ، مبادله طبق معمول با استفاده از درخواست HTTP با همان طرح ساخته می شود. SSL به عنوان پروتکل امنیت اطلاعات استفاده می شود (اما این موضوع جداگانه است).</p> <p>یکی از گزینه های ممکن برای پردازش پیام های XML ساخت برنامه های BIN / CGI (ISAPI) یا اجزای COM (سرور) است که اسناد XML را تولید یا پردازش می کند.</p> <p>از یک طرف ، برنامه به عنوان مشتری عمل می کند ، که درخواست HTTP را در حالت POST صادر می کند ، از طرف دیگر یک سرور WEB وجود دارد که در آن طرف ، درخواست پردازش شده و پاسخی صادر می شود. اسناد XML در تبادل اطلاعات استفاده می شود.</p> <p>یکی از گزینه های کارآمد اجرای ، استفاده از یک تجزیه کننده XML موجود است که از مدل DOM پشتیبانی می کند. چنین تجزیه گر بسته ای از توزیع Win'98 یا بخشی جدایی ناپذیر از IE 4.7 و بالاتر (برای Win'95) است و یک سرور COM را که در کتابخانه msxml.dll قرار دارد ، نشان می دهد.</p> <p>Model Object Model (COM) - داده ها و روش های محصور شده را به یک موجودیت واحد و راهی برای دسترسی به آنها از طریق سیستم رابط ها ارائه می دهد. با استفاده از ابزارهای Delphi ، دسترسی به کلاسهای یک شیء COM بسیار آسان است (چندین کلاس را می توان در یک سرور COM گنجانید). با آغاز یک نمونه کلاس از طریق سیستم رابط ، به اشیاء دسترسی پیدا می کنید. توضیحات واسط ها توسط زبان تعریف رابط (IDL) انجام می شود ، که می تواند با استفاده از محیط به صورت خودکار انجام شود.</p> <p>از ابزارهای Delphi برای وارد کردن از سرور COM استفاده می شود <i>msxml.dll</i>، فایلهای توصیف رابط IDL و پرونده شرح باینری انواع کتابخانه - TLB ساخته شده اند. این عملیات از طریق منوی سیستم انجام می شود: <b>پروژه | واردات کتابخانه نوع:</b>(تصویر 1) در مرحله بعد ، کادر محاوره ای ظاهر می شود (شکل 2) ، که در آن شما باید یک شی COM را انتخاب کنید (در مورد ما ، شی با نام "Microsoft.XMLDom (نسخه 2.0)" ثبت شده است) و یک فایل TLB (دکمه <b>ایجاد واحد</b>) این چارچوب با استفاده از فایل TLB ، یک فایل توصیف سرور Pascal COM ایجاد می کند - MSXML_TLB.pas</p> <p>پرونده MSXML_TLB.pas تمام رابط ها ، ثابت ها و کلاس سرور COM را توصیف می کند.</p> <p>برای دسترسی به اشیاء یک عنصر COM ، در بخشنامه نیاز دارید <b>موارد استفاده</b>نام پرونده توضیحات کتابخانه (MSXML_TLB.pas) را اضافه کنید. در زیر یک برنامه ساده با استفاده از تجزیه کننده استاندارد DOM msxml.dll استاندارد وجود دارد ، که یک سند XML را بار می کند و آن را در یک عنصر زمینه متن Memo1 نمایش می دهد.</p> <b>استفاده می کند</b> Windows ، Messages، SysUtils، Classs، Graphics، Control، Forms، Dialogs، OleServer، MSXML_TLB، StdCtrls؛ <b>نوع</b> TForm1 \u003d <b>کلاس</b>(TForm) Button1: TButton؛ Memo1: TMemo؛ <b>روش</b> Button1Click (فرستنده: TObject)؛ <b> پایان؛</b> <b>واری</b> فرم1: TForm1؛ <b>پیاده سازی</b> ($ R * .DFM) <b>روش</b>TForm1.Button1Click (فرستنده: Tobject)؛ <span> // اعلام soclass از شیء DOMDocument؛</span> <b>واری</b>coDoc: CoDOMDocument؛ <span> // کلاس سازگار با رابط IDOMDocument؛</span> <b>واری</b>Doc: IXMLDOMDocument؛ <b>شروع</b> <span> // ایجاد نمونه ای از شیء DOMDocument؛</span> Doc: \u003d coDoc.Create؛ <span> // با روش بار از نمونه ای از شیء DOMDocument تماس بگیرید؛</span> Doc.load ("data.xml")؛ <span> // دسترسی به ویژگی xml از نمونه DOMDocument؛</span> Memo1.Text: \u003d Doc.xml؛ <b>پایان؛</b> <b>پایان.</b> <h2>مفهوم DOM - مدل شیء اسناد</h2> <p>هر سند XML به عنوان مجموعه ای از اشیاء مختلف (کلاس ها) نمایش داده می شود ، که به کمک آن می توان به عناصر فردی (زمینه های شی) دسترسی داشت. DOM - رابط دسترسی هر دو اشیاء ساده از DOMString یا نوع CharacterData و بخش ها یا عناصر مجزا از یک سند XML را توصیف می کند: DOMFragmentElement ، DOMNode ، DOMElement.</p> <p>در زیر مهمترین خصوصیات و روشهای XMLDOMDocument ، XMLDOMNode ، XMLDOMNodeList اشیاء ذکر شده است. لازم به ذکر است که روشها و کارکردهای اشیاء DOM ارائه شده در زیر (Document Object Model) توسط Microsoft XML تجزیه کننده msxml.dll استفاده شده و تا حدودی وسیع تر از مدل تصویب شده توسط کنسرسیوم D3 W3C است.</p> <p>توضیحات کامل تر رابط شی DOM را می توان در اینجا یافت</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2"> XMLDOM شیء سند</td> </tr><tr><td valign="top" colspan="2">سطح بالای سلسله مراتب شی را نشان می دهد و شامل روش هایی برای کار با یک سند است: بارگذاری آن ، تجزیه و تحلیل آن ، ایجاد عناصر ، ویژگی ها ، نظرات و غیره. ...</td> </tr><tr><td valign="top" colspan="2"><b>خصوصیات</b> </td> </tr><tr><td valign="top" width="39%"><b>Async</b> </td> <td valign="top" width="61%">خاصیت شناسایی حالت پردازش فعلی</td> </tr><tr><td valign="top" width="39%" height="19"><b>خطای تجزیه</b> </td> <td valign="top" width="61%" height="19">یک مرجع به موضوع خطای XMLDOMParseError برمی گرداند</td> </tr><tr><td valign="top" width="39%"><b>فعال کردن - غیرفعال کردن تأیید سند.</b> </td> <td> </td> </tr><tr><td valign="top" width="39%"><b>آدرس</b> </td> <td valign="top" width="61%">نشانی اینترنتی سند را برمی گرداند</td> </tr><tr><td valign="top" width="39%"><b>مستندات</b> </td> <td valign="top" width="61%">شامل یک عنصر ریشه ای سند به عنوان یک شی XMLDOMElement است.</td> </tr><tr><td valign="top" colspan="2"><b>مواد و روش ها</b> </td> </tr><tr><td valign="top" width="39%"><b>بار (url) <br>loadXML (xmlString)</b> </td> <td valign="top" width="61%">بارگیری یک سند XML ،</td> </tr><tr><td valign="top" width="39%"><b>ذخیره (objTarget)</b> </td> <td valign="top" width="61%">اسناد XML را برای پرونده ذخیره می کند</td> </tr><tr><td valign="top" width="39%"><b>سقط</b> </td> <td valign="top" width="61%">قطع روند بارگیری و پردازش سند.</td> </tr><tr><td valign="top" width="39%"><b>ایجاد یک ویژگی (نام)</b> </td> <td valign="top" width="61%">یک عنصر جدید با نام مشخص شده برای عنصر فعلی ایجاد می کند.</td> </tr><tr><td valign="top" width="39%"><b>ایجادNode (نوع ، نام ، nameSpaceURI)</b> </td> <td valign="top" width="61%">گره ای از نوع و نام مشخص شده ایجاد می کند</td> </tr><tr><td valign="top" width="39%"><b>ایجادElement (برچسب نام)</b> </td> <td valign="top" width="61%">یک عنصر سند را با نام مشخص شده ایجاد می کند.</td> </tr><tr><td valign="top" width="39%"><b>ایجادTextNode (داده)</b> </td> <td valign="top" width="61%">متن را درون یک سند ایجاد می کند</td> </tr><tr><td valign="top" width="39%"><b>getElementsByTagName (tagname)</b> </td> <td valign="top" width="61%">یک مرجع به مجموعه عناصر سند با نام داده شده برمی گرداند</td> </tr><tr><td valign="top" width="39%"><b>nodeFromID (idString)</b> </td> <td valign="top" width="61%">یافتن یک مورد با شناسه</td> </tr></tbody></table><br><table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2"> <b>XMLDOMNode شی</b> </td> </tr><tr><td valign="top" colspan="2">شی XMLDOMNode که رابط زیربنایی DOM را پیاده سازی می کند <b>گره</b>در نظر گرفته شده برای دستکاری با یک گره جداگانه از درخت سند. خصوصیات و روشهای آن به شما امکان می دهد اطلاعات کامل در مورد گره فعلی را دریافت و تغییر دهید - نوع ، نام ، نام کامل ، محتوای آن ، لیست عناصر کودک و غیره.</td> </tr><tr><td valign="top" colspan="2"><b>خصوصیات</b> </td> </tr><tr><td valign="top" width=" "><b>nodeName ، baseName</b> </td> <td valign="top" width="65%">نام گره فعلی را برمی گرداند.</td> </tr><tr><td valign="top" width="35%"><b>پیشوند</b> </td> <td valign="top" width="65%">پیشوند Namespace را برمی گرداند.</td> </tr><tr><td valign="top" width="35%"><b>نوع داده</b> </td> <td valign="top" width="65%">نوع محتوای گره فعلی را مشخص می کند</td> </tr><tr><td valign="top" width="35%"><b>nodeType ، nodeTypeString</b> </td> <td valign="top" width="65%">نوع گره فعلی را برمی گرداند:</td> </tr><tr><td valign="top" width="35%"><b>ویژگی های</b> </td> <td valign="top" width="65%">لیستی از خصوصیات گره فعلی را به عنوان مجموعه XMLDOMNamedNodeMap جمع می کند.</td> </tr><tr><td valign="top" width="35%"><b>متن</b> </td> <td valign="top" width="65%">محتویات subtree فعلی را به عنوان متن برمی گرداند</td> </tr><tr><td valign="top" width="35%"><b>xml</b> </td> <td valign="top" width="65%">بازنمود XML از Subtree فعلی را برمی گرداند.</td> </tr><tr><td valign="top" width="35%"><b>nodeValue</b> </td> <td valign="top" width="65%">محتویات گره فعلی را برمی گرداند.</td> </tr><tr><td valign="top" width="35%"><b>childNodes</b> </td> <td valign="top" width="65%">لیستی از عناصر کودک را به عنوان XMLDOMNodeList برمی گرداند.</td> </tr><tr><td valign="top" width="35%"><b>اول کودک ، فرزند آخر</b> </td> <td valign="top" width="65%">فرزند اول / آخر را برمی گرداند</td> </tr><tr><td valign="top" width="35%"><b>previousSibling ، nextSibling</b> </td> <td valign="top" width="65%">عنصر خواهر و برادر قبلی / بعدی را برمی گرداند.</td> </tr><tr><td valign="top" width="35%"><b>پدر و مادر</b> </td> <td valign="top" width="65%">دارای پیوندی به عنصر والدین است.</td> </tr><tr><td valign="top" width="35%"><b>صاحب سند</b> </td> <td valign="top" width="65%">یک اشاره گر را به سند حاوی گره فعلی باز می گرداند.</td> </tr><tr><td valign="top" colspan="2"><b>مواد و روش ها</b> </td> </tr><tr><td valign="top" width="35%"><b>appendCild (فرزند جدید)</b> </td> <td valign="top" width="65%">کودک جدیدی را به گره فعلی اضافه می کند.</td> </tr><tr><td valign="top" width="35%"><b>insert قبل از (فرزند جدید ، کودک تازه)</b> </td> <td valign="top" width="65%">گره کودک را درج می کند ، آن را در زیر درخت فعلی "در سمت چپ" گره مشخص شده با پارامتر refChild قرار می دهد.</td> </tr><tr><td valign="top" width="35%"><b>cloneNode (عمیق)</b> </td> <td valign="top" width="65%">یک کپی از مورد فعلی ایجاد می کند.</td> </tr><tr><td valign="top" width="35%"><b>getAttribute</b><b>(نام) <br> </b><b>getAttributeNode</b><b><span> (نام) <br>setAttribute (نام ، مقدار) <br>setAttributeNode (XMLDOMAttribute)</span> </b> </td> <td valign="top" width="65%">دسترسی به صفات (ایجاد ، خواندن ، نوشتن) از شی. اسم نام صفت است ، ارزش مقدار آن است. یک شی XMLDOMAttribute را برمی گرداند.</td> </tr><tr><td valign="top" width="35%"><b>جایگزین کودک (فرزند جدید ، کودک قدیمی) حذف فرزند (قدیمی کودک)</b> </td> <td valign="top" width="65%">با جایگزین کردن موضوع oldChild لیست فعلی اشیاء کودک با newChild. در حال حذف شی قدیمی</td> </tr><tr><td valign="top" width="35%"><b>selectNodes (patternString) selectSingleNode (patternString)</b> </td> <td valign="top" width="65%">یک شی XMLDOMNodeList انتخاب شده توسط الگوی جستجو یا گره اول را برمی گرداند</td> </tr><tr><td valign="top" width="35%"><b>transformNode (شیوه نامه) <br>transformNodeToObject (شیوه نامه ، خروجی هدف)</b> </td> <td valign="top" width="65%">یک برگه سبک به زیر درخت گره فعلی اختصاص می دهد و رشته ای را که نتیجه پردازش است برمی گرداند. این پارامتر مرجعی به شیء DOMDocument است که شامل عبارات XSL است.</td> </tr></tbody></table><br><h2>استفاده از XML در تجارت.</h2> <p>برای تصویر واضح تر ، توضیحی لازم است و اینکه چرا همه این موارد برای درک چگونگی عملکرد آن لازم است:</p> <p>هنگام ساختن یک سیستم ERP B2B یا شرکت های بزرگ ، هنگام سازماندهی تبادل اطلاعات اسناد XML بین شرکت ها یا شعبه های pr-I ، یک سیستم انتقال اطلاعات اثبات شده مبتنی بر سرورهای WEB موجود بر روی پروتکل های HTTP بطور موثر استفاده می شود.</p> <p>از یک طرف ، برنامه به عنوان مشتری عمل می کند ، که درخواست HTTP را در حالت POST صادر می کند ، از طرف دیگر یک سرور WEB وجود دارد که از طرف آن درخواست پردازش می شود و پاسخی صادر می شود. اسناد XML به عنوان مبادله استفاده می شود.</p> <p>به عنوان مثال ، در یک سیستم ERP شرکتی ساده ، یک برنامه حسابداری (حسابداری ACS) ، لازم است تا درخواست فاکتور را تشکیل داده و آن را به شعبه ای که دارای یک انبار است (انبار ACS) ارسال کنید. AWP بیانیه مشکل مشابه هنگام ایجاد سیستم B2B ، هنگامی که Enterprise A درخواست دسترسی به محصولات (سفارش برای خرید) را از تامین کننده B درخواست می کند.</p> <p>تصدی A و برنامه آن به عنوان مشتری عمل می کند. انبار توسط تأمین کننده B سرویس دهی می شود که دارای یک انبار پایگاه داده در سرور SQL است. این مبادله از طریق سرور وب وب شرکت تأمین کننده V انجام می شود.</p> <p>در زیر الگوریتم ارز معمولی زیر آورده شده است:</p> <br>شکل 3 <ol><li><b>تصدی آ</b>شروع می کند <b>پردازش A</b>(سفارش محصول) ، که به عنوان یک مشتری وب فعالیت می کند.</li><li><b>فرآیند A</b>یک سند XML تولید می کند (به عنوان مثال ، یک درخواست فاکتور) و آن را به عنوان درخواست POST http به سرور WEB ارائه دهنده B. منتقل می کند. شناسه منبع برنامه پردازش به عنوان URI استفاده می شود. URI می تواند برای انواع اسناد یا برای هر نوع یکسان باشد. همه اینها به ساختار سرور B2B (WEB) بستگی دارد.</li><li>سرور WEB درخواست را تجزیه و تحلیل می کند و سرور تولید می کند <b>فرآیند B</b>با عبور دادن بدنه از سند XML به عنوان پارامتر. <br>فرآیند B توسط یک سرور WEB راه اندازی شده است یا به صورت یک صفحه ASP ، برنامه CGI (ISAPI) یا سرور JAVA (برنامه سرور) پردازش می شود.</li><li><b>فرآیند B</b>- یک سؤال را برای سرور پایگاه داده SQL ایجاد می کند.</li><li>سرور SQL عملیات لازم را در پایگاه داده انجام می دهد ، پاسخی را ایجاد می کند و آن را برمی گرداند <b>فرآیند B</b>.</li><li>مطابق پاسخ سرور SQL <b>فرآیند B</b> یک سند XML (پاسخ) ایجاد می کند و آن را به عنوان پاسخ به درخواست http به برنامه مشتری باز می گرداند.</li><li>علاوه بر این ، بسته به وضعیت طرف مشتری ، یا یک درخواست http جدید تشکیل می شود ، یا جلسه به پایان می رسد.</li> </ol><h2>چند کلمه در مورد سازماندهی جریان اسناد.</h2> <p>قانون کلی برای توسعه سیستم مبادله اسناد XML این است:</p><ul><li><b>اولا</b>- تهیه نمودار جریان اسناد الکترونیکی و ساختار آنها.</li><li><b>ثانیا</b>- توسعه جداول توابع فرآیند (فرایندهای پردازشی) ، یعنی چه تابع با توجه به کدام سند XML هر فرآیند را اجرا خواهد کرد.</li> </ul><p>هر سند XML ، مانند یک سند HTML ، باید از یک هدر پیام (اطلاعات محصور شده توسط برچسب ها) و یک متن پیام (برای درخواست ، این اطلاعات برای پاسخ به یک درخواست با برچسب ها قاب بندی شده است) باشد. برای اینکه سند XML به خوبی شکل بگیرد ، لازم است به عنوان مثال ، دو جزء آن "عنوان" و "درخواست" را با برچسب ها قاب بندی کنید. نوع یک سند معمولی در زیر ارائه می شود:</p> <p>عنوان (تصویر 4) برخلاف سند HTML باید حاوی انواع مختلفی از خدمات خدمات از جمله اطلاعاتی در مورد نوع سند منتقل شده و روند پردازش آن باشد. بدنه سند وارد پردازش اطلاعات می شود ، یعنی. محتویات متناسب با برچسب ها. لازم به ذکر است که ساختار عناوین باید برای همه نوع اسناد یکسان باشد.</p> <p>برای فرآیندی که توسط سرور آغاز شده است ، الگوریتم پردازش به شرح زیر ساخته می شود (اما لازم نیست):</p> <img src='https://i2.wp.com/codenet.ru/np-includes/upload/2005/01/05/128666.jpg' height="500" width="408" loading=lazy><br>شکل 6 <h2>برخی از نکات اساسی در هنگام ایجاد سمت مشتری</h2> <p>همانطور که قبلاً توضیح داده شد ، هنگام ایجاد یک سند XML ، از نمایشگر آن در قالب یک مدل DOM استفاده می شود. در زیر مثالی از بخش متن Delphi از برنامه تولید کننده هدر پیام xml آورده شده است.</p> <b>روش</b>TThread1.HeaderCreate (فرستنده: Tubject)؛ <b>واری</b> <span> // اعلامیه کلاس ، مورد نیاز برای ایجاد</span> coDoc: CoDomDocument؛ <span> // شی XMLDomDocument</span> Doc: DomDocument؛ r: IXMLDOMElement؛ گره: IXMLDOMElement؛ // DOMText txt: IXMLDOMText؛ // جذابیت DOMAttribute: IXMLDOMAttribute؛ <b>شروع</b> <span> // ایجاد سند DOM</span> Doc: \u003d coDoc.Create؛ Doc.Set_async (نادرست)؛ <span> // آغاز اولیه سند DOM</span> Doc.LoadXML (" <Header/>"); <span> // ایجاد DOMElement (برچسب)<<b>فرستنده</b>>) </span> گره: \u003d Doc.createElement ("فرستنده")؛ <span> // ایجاد گره متن " <b>Typhoon LLC</b>" </span> txt: \u003d Doc.createTextNode ("Typhoon LLC")؛ <span> // انتساب به گره<<b>فرستنده</b>\u003e ارزش</span> <span> // گره متن " <b>Typhoon LLC</b>" </span> Node.appendChild (txt)؛ <span> // اضافه کردن عنصر<<b>فرستنده</b>\u003e به عنوان یک کودک به ریشه سند</span> r.appendChild (گره)؛ <span> <<b>از جانب</b>> </span> گره: \u003d Doc.createElement ("از")؛ txt: \u003d Doc.createTextNode ("http://tayfun.ru/xml/default.asp")؛ Node.appendChild (txt)؛ r.appendChild (گره)؛ <span> // عملیات مشابه برای برچسب<<b>به</b>> </span> گره: \u003d Doc.createElement ("به")؛ txt: \u003d Doc.createTextNode ("http://irbis.ru")؛ Node.appendChild (txt)؛ r.appendChild (گره)؛ <span> // ایجاد DOMElement ()</span> گره: \u003d Doc.createElement ("TypeDocument")؛ <span> // ایجاد گره XMLDOMAttribute</span> Att: \u003d Doc.createAttribute ("شناسه" ، "سفارش")؛ <span> // <TypeDocument Id="Order"/> </span> Node.appendChild (Att)؛ r.appendChild (گره)؛ <b>پایان؛</b> <p>لازم به ذکر است که اعلام متغیر coDoc: CoDomDocument و Doc: DomDocument و همچنین ایجاد آن با روش ایجاد (Doc: \u003d coDoc.Create؛) یک بار انجام می شود. اظهارنامه متغیر در بخش توصیف متغیرهای جهانی قرار دارد و نه در روش محلی ، همانطور که برای وضوح در این مثال نشان داده شده است (یعنی یک متغیر جهانی از نوع DomDocument در هر یک از ماژول های برنامه).</p> <p>نتیجه کار برنامه فوق ، هدر ایجاد شده خواهد بود که برای مثال xml مثال ما اعمال شده است: در شکل 5 نشان داده شده است.</p> <img src='https://i2.wp.com/codenet.ru/np-includes/upload/2005/01/05/128662.gif' height="116" width="298" loading=lazy><br>شکل 5 <p><img src='https://i0.wp.com/codenet.ru/np-includes/upload/2005/01/05/128664.gif' height="179" width="385" loading=lazy><br>شکل 6</p><p>مهمترین مزیت انتقال اطلاعات در قالب اسناد XML این است که می توان با استفاده از ساختارهای جدول جداگانه در DBMS ، هر دو طرف دریافت و انتقال ، پیام را ایجاد کرد. با استفاده از مثال ما ، فرض کنید لازم است اطلاعات مربوط به فاکتورهای Enterprise A از DBMS که دارای ساختار نشان داده شده در شکل 6 است ، منتقل کنید.</p> <p>برای تولید یک سند xml حاوی فاکتور ، ابتدا یک سؤال SQL (پرس و جو A) با اطلاعاتی درباره خود فاکتور ساخته می شود:</p> <b>انتخاب کنید</b> * از فاکتور_ عمومی <b>جایی که</b> فاکتور Num \u003d: num <b>انتخاب کنید</b>کالا ، Qulity ، قیمت ، HZ_cod <b>از جانب</b>کالاها <b>جایی که</b> فاکتور Num \u003d: num <span> //: num - پارامتری که شماره فاکتور را مشخص می کند.</span> <p>در زیر بخشی از برنامه که بدنه سند xml را تولید می کند آورده شده است:</p> <b>روش</b> TThread1.DataBodyCreate (فرستنده: Tobject)؛ <b>واری</b> <span> // اعلام کلاس و شی XMLDomDocument</span> // coDoc: CoDomDocument؛ <span> // باید برای کل ماژول جهانی باشد.</span> // Doc: DomDocument؛ <span> // اعلام DOMElement اشیاء</span> r: IXMLDOMElement؛ // DOMElement؛ گره ، Node2: IXMLDOMElement؛ Node3، Node4: IXMLDOMElement؛ // DOMText txt: IXMLDOMText؛ str: رشته؛ <span> // فاکتور شماره: <b>عدد صحیح</b> - متغیر جهانی - // دارای ارزش 987654 // queryA ، queryB است: <b>رشته؛</b> - متغیر جهانی ، // دارای یک مقدار مطابق با پرس و جو // queryA - پرس و جو A با اطلاعات کلی در مورد فاکتور // queryB - پرس و جو B اطلاعات مربوط به کالاهای شرح داده شده در // فاکتور (متن را مشاهده کنید)</span> <b>شروع</b> Query.Close؛ <span> // دیدن متن "درخواست الف"</span> Query.Text: \u003d queryA؛ <span> // اجرای درخواست</span> Query.ExecSQL؛ Query.Open؛ <span> // آدرس عنصر ریشه را بدست آورید</span> r: \u003d Doc.Get_documentElement؛ Node2: \u003d Doc.createElement ("درخواست")؛ <span> // ایجاد DOMElement (برچسب)</span> گره: \u003d Doc.createElement ("فاکتور")؛ <span> // اضافه کردن یک عنصر به ریشه</span> r.appendChild (Node2)؛ <span> // اضافه کردن یک مورد به</span> Node2 appendChild (گره)؛ <span> // ایجاد DOMElement (برچسب)</span> Node3: \u003d Doc.createElement ("سقوط")؛ <span> // اضافه کردن یک مورد به</span> گره appendChild (Node3)؛ <span> // تماس با قسمت "فرار" از درخواست</span> str: \u003d Query.FieldByName ("سقوط"). AsString؛ <span> // ایجاد گره متن \u003d مقدار فیلد</span><span> // مقدار را به گره اختصاص دهید</span> <span> // گره متن ، خیابان متغیر</span> Node.appendChild (txt)؛ <span> // عملیات مشابه برای برچسب <Destination>, <DataSend>, // <DataDepurture>, <Currency> // <DestinationCompany> (زمینه DB "گیرنده")</span> گره: \u003d Doc.createElement ("مقصد")؛ <span> // نام زمینه بانک اطلاعاتی ممکن است با نام مشابه نباشد</span> str: \u003d Query.FieldByName ("گیرنده") .AsString؛ <span> // برچسب ، این مزیت استفاده است</span> txt: \u003d Doc.createTextNode (Str)؛ <span> // DOM رابط جلوی DBMS که از رابط XML پشتیبانی می کند ، // مانند ORACLE 8i یا Ms SQL 2000</span> Node.appendChild (txt)؛ ... <span> // تولید درخواست برای مشخصات کالا</span> <span> // درخواست دسترسی را ببندید</span> Query.Close؛ <span> // در متن "درخواست B" ، اطلاعات را ببینید. درباره کالاها</span> Query.Text: \u003d پرس و جو؛ <span> // اختصاص مقادیر پارامتر</span> Query.Params.AsInteger: \u003d InvoiceNumber؛ <span> // اجرای درخواست</span> Query2.ExecSQL؛ <span> // دسترسی آزاد به درخواست داده ها</span> Query.Open؛ <span> // ایجاد DOMElement (برچسب)</span> Node3: \u003d Doc.createElement ("Imames")؛ <span> // اضافه کردن یک مورد به</span> گره appendChild (Node3)؛ <span> // حلقه در تمام خطوط پرس و جو</span> <b>در حالی که</b> <b>نه</b> Eof.Query <b>انجام دادن</b> شروع Node4: \u003d Doc.createElement ("Imem")؛ <span> // اضافه کردن یک مورد به</span> Node3.appendChild (Node4)؛ <span> // تولید داده برای برچسب</span> str: \u003d Query.FieldByName ("قیمت"). AsString؛ txt: \u003d Doc.createTextNode (Str)؛ Node.appendChild (txt)؛ ... <span>// عملیات مشابه برای برچسب ها <HZ_Cod>, <Quality>, <GoodName> </span> <b>پایان؛</b> <b>پایان؛</b> <p>در نتیجه این روش ، متن سند XML زیر تولید می شود:</p> <table width="100%"><tbody><tr><td align="middle"><br><img src='https://i1.wp.com/codenet.ru/np-includes/upload/2005/01/05/128661.gif' width="100%" loading=lazy></td> </tr></tbody></table><p>برای تشکیل درخواست ، از روش Open شی استفاده کنید <b>IXMLHttpRequest</b>:</p> <b>روش</b> باز کردن (const bstrMethod ، - نوع متد \u003d "POST" bstrUrl ، - آدرس اینترنتی سرور varAsync ، - حالت ارتباطی ناهمزمان / همگام \u003d bstrUser واقعی ، - نام کاربری برای تأیید اعتبار bstrPassword) - رمز عبور <h2>ایجاد سمت سرور پردازش اسناد</h2> <p>همانطور که قبلاً اشاره شد ، پردازش درخواست HTTP توسط برنامه های CGI یا سرویس های جاوا قابل کنترل است. نوشتن صفحات ASP همچنین امکان پذیر است. اما در این حالت انتقال داده فقط با روش "GET" از طریق رشته پرس و جو امکان پذیر است. با این حال ، رسیدگی به درخواست HTTP برای صفحات ASP نسبت به برنامه CGI کارآمدتر است. با این حال ، به نظر من مهم نیست که چگونه آن را پردازش کنیم ، بلکه تصمیم گیری در مورد چگونگی ساخت یک برنامه پردازش مهم است و نه با چه معنی.</p> <p>اگر از فصل قبل گزینه های تشکیل یک سند XML را بررسی کردیم ، وظیفه برنامه سرور برعکس است - تجزیه اسناد XML. در زیر بخشی از برنامه که یک سند xml را تجزیه می کند:</p> <b>روش</b>Tthread1.DataParser (فرستنده: Tubject)؛ <b>واری</b> <span>// اعلام DOMElement اشیاء</span> r، FNode: IXMLDOMElement؛ خیابان ، نام پرونده: String؛ parm: رشته؛ <span>// اعلامیه soclass و</span> CoDocXML ، CoDocXSL ، CoDocResult: CoDomDocument؛ <span>// شی XMLDomDocument</span> XMLDoc، XSLDoc، ResultDoc: DomDocument؛ <span>// HttpStr: رشته؛ - یک متغیر جهانی حاوی رشته درخواست HTTP</span> <b>شروع</b> XMLDoc: \u003d coDocXML.Create؛ XMLDoc.LoadXML (HttpStr)؛ <span> // آدرس عنصر ریشه را بدست آورید</span> r: \u003d Doc.Get_documentElement؛ <span> // مقدار عنصر را بدست آورید</span> FNode: \u003d r.SelectSingleNode ("// TypeDocument")؛ <span> // دریافت مقدار ویژگی id \u003d "سفارش"</span> نام پرونده: \u003d FNode.GetAttibute ("شناسه")؛ <span> // و تشکیل نام پرونده Order.xsl</span> FileName: \u003d FileName + ". Xsl"؛ <span> // ایجاد سند XSLDoc</span> XSLDoc: \u003d coDocXSL.Create؛ XSLDoc.LoadXML (نام پرونده)؛ <span> // ایجاد سند XMLDoc</span> ResultDoc: \u003d coDocResult.Create؛ <span> // تنظیم حالت پردازش همزمان</span> ResultDoc.Set_async (نادرست)؛ <span> // تنظیم چک جعلی</span> ResultDoc.validateOnParse: \u003d true؛ <span> // تجزیه XMLDoc با استفاده از الگوی XSL</span> XMLDoc.transformNodeToObject (XSLDoc، ResultDoc)؛ <span> // متغیر Str یک مقدار متن اختصاص داده شده است</span> <span> // از سند نتیجه.</span> خیابان: \u003d ResultDoc.text؛ <span> // عنصر پیدا کنید</span> FNode: \u003d r.SelectSingleNode ("// InvoiceNumber")؛ <span> // و مقدار عنصر را بدست آورید</span> parm: \u003d FNode.text؛ <span> // درخواست دسترسی را ببندید</span> Query.Close؛ Query.Text: \u003d Str؛ <span> // اختصاص مقدار پارامتر</span> Query.Params.AsString: \u003d parm؛ <span> // اجرای درخواست</span> Query.ExecSQL؛ <b>پایان؛</b> <p>کل برجسته تجزیه در استفاده از یک الگوی XSL است که بطور جداگانه برای هر نوع سند تشکیل شده است. نتیجه تجزیه یک رشته پرس و جو SQL است. پس از آن ، اجرای رشته پرس و جو SQL ایجاد شده باعث ایجاد داده های لازم در DBMS می شود.</p> <p>مزیت استفاده از تجزیه از طریق یک الگو نیز این است که شما به نوعی انعطاف پذیری داده ها را بدست می آورید و استقلال کامل الگوریتم را از کد برنامه دریافت می کنید. در زیر متن قالب XSL استفاده شده برای پردازش یک سند ORDER:</p><p> <!-- файл Order.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="//header"> ارزش به TABREG (از ، تا ، TYPEDOC ، بدن) ارزش ها (" <xsl:value-of select="from" />", "<xsl:value-of select="to" />", "<xsl:value-of select="TypeDocument/@id" />") </xsl:for-each> <xsl:for-each select="//item"> وارد شدن به کالا (فاکتور شماره ، نام ، قیمت ، کیفیت) ارزش ها (": num" ، " <xsl:value-of select="name" />", "<xsl:value-of select="price" />", "<xsl:value-of select="quality" /> ") </xsl:for-each> </xsl:template> </xsl:stylesheet> </p><p>با توضیح مثال بالا ، لازم به ذکر است که استفاده از یک جفت تگ از نظر ماهیت رسمی است ، زیرا پس از تجزیه ، سند XML حاصل باید رسماً دارای حداقل یک گره باشد. روش ResultDoc.text مقدار متن ResultDoc به دست آمده هنگام تجزیه سند XML را اختصاص می دهد. در این حالت ، مقدار آن چیزی است که توسط یک جفت تگ ساخته می شود و ، یعنی. پرس و جو SQL ما ایجاد شده است.</p> <p>از ویژگی های دیگر نوشتن برنامه می توان به امکان استفاده از پارامتر SQL اشاره کرد <b>: شماره</b> با استفاده از پارامتر متن قالب xsl ساده می شود. تعریف مقدار عناصر مربوط به گره های سند XML در ابتدا با انتخاب با نام گره مربوطه تعیین می شود ، به عنوان مثال:</p><h2>XSL به طور خلاصه</h2> <p>XSL مخفف کلمه ای است که از زبان سبک eXtensible Stylesheet Language ، یک زبان قالب بندی شیوه نامه (داده های XML) تهیه شده است. همانطور که از سرصفحه مشاهده می کنید ، زبان سبک eXtensible (XSL) برای قالب بندی داده های XML استفاده می شود. طبق تعریف ، W3C XSL از دو بخش تشکیل شده است:</p> <ul><li>XSLT - XSL Transformation. زبانی که برای تبدیل یا قالب بندی (تبدیل) اسناد XML استفاده می شود. بنابراین ، با استفاده از XSLT ، می توان بخشهای مختلفی از مجموعه داده ها و اشکال ارائه داده ها را بدست آورد.</li><li>قالب بندی عناصر. این عناصر بعد از پردازش آنها با XSL ، تمام عناصر تایپیوگرافی داده ها را شامل می شوند. فقط برای تولید صفحات HTML استفاده می شود.</li> </ul><p>با کمک XSLT می توانیم داده های مورد نیاز خود را از یک فایل XML انتخاب کنیم و آن را به صورت فرم برای ارائه به کاربر ترتیب دهیم. به عنوان مثال ، در مورد ما ، داده های XML را در قالب یک پرس و جو SQL تبدیل کرده ایم. استفاده کلاسیک از XSL معمولاً قالب بندی داده ها به صورت صفحات HTML یا به ندرت در قالب پرونده های RTF است.</p> <p>پرونده XSL یک الگوی را توصیف می کند ، که براساس آن تغییر داده های XML انجام خواهد شد. با بازگشت به الگوهای xsl ، عناصر زیر (بخشنامه ها) در XSLT قابل تشخیص است:</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" width="31%"> <b>دستورالعمل های XSL</b> </td><th align="middle" width="69%"> <b>شرح</b> </th> </tr><tr><td>xsl: اعمال-قالب</td> <td>بخشنامه ای مبنی بر استفاده از الگوهای تطبیق برای ویژگی انتخاب \u003d "نام الگوی"</td> </tr><tr><td>xsl: ویژگی</td> <td>یک درخت صفت ایجاد می کند و آن را به عنصر خروجی ، نام پارامتر \u003d "نام ویژگی" اضافه می کند ، namespace یک نام URI (پیشوند فضای نام) است</td> </tr><tr><td>xsl: call-pattern</td> <td>تماس با یک الگوی ، نام ویژگی \u003d "URI به الگوی"</td> </tr><tr><td>xsl: انتخاب کنید <br>xsl: when <br>xsl: در غیر این صورت</td> <td>انتخاب با شرط xsl: وقتی expr \u003d "ارزیابی بیان در اسکریپت" ، <br>language \u003d "language-name" <br>test \u003d "بیان ارزیابی شده"</td> </tr><tr><td>xsl: نظر</td> <td>در سند خروجی نظری ایجاد می کند</td> </tr><tr><td>xsl: کپی کنید <br>xsl: copy-of</td> <td>گره فعلی را به منبع خروجی کپی می کند یا یک قطعه سند را در یک گره وارد می کند که در آن ویژگی \u003d \u003d نام گره منبع</td> </tr><tr><td>xsl: element</td> <td>عنصر خروجی را با نام ، نام ویژگی \u003d "نام عنصر" ، namespace \u003d "مرجع نام namespace" ایجاد می کند</td> </tr><tr><td>xsl: برای هر</td> <td>قالب را به همه گره های لیست گره مجدد می دهد ، ویژگی انتخاب لیست گره ها را مشخص می کند</td> </tr><tr><td>xsl: اگر</td> <td>بررسی وضعیت ، مشخص شده توسط ویژگی آزمون به عنوان عبارت</td> </tr><tr><td>xsl: شامل</td> <td>شامل الگوی خارجی ، ویژگی href \u003d "مرجع URI"</td> </tr><tr><td>xsl: خروجی</td> <td>خروجی را مشخص می کند ، ویژگی متد می تواند "xml" ، "html" یا "متن" باشد</td> </tr><tr><td>xsl: param</td> <td>مقدار پارامترها ، نام ویژگی \u003d "نام پارامتر" ، انتخاب \u003d "مقدار" را مشخص می کند</td> </tr><tr><td>xsl: دستورالعمل پردازش</td> <td>یک دستورالعمل پردازش ، نام ویژگی \u003d "نام دستورالعمل فرآیند" ایجاد می کند</td> </tr><tr><td>xsl: مرتب سازی</td> <td>مجموعه گره ها ، ویژگی ها را انتخاب کنید "نام گره" ، نوع داده \u003d نوع داده ("متن" | "شماره" | نام) ، ترتیب \u003d جهت مرتب سازی ("صعودی" | "نزولی")</td> </tr><tr><td>xsl: برگه سبک</td> <td>یک سند الگوی xsl را تعریف می کند ، عنصر اصلی XSLT است</td> </tr><tr><td>xsl: قالب</td> <td>xsl-الگو ، نام ویژگی \u003d "پیشوند URI به نام الگو" ، match \u003d "نشانه ای از گره ای که الگو در آن اعمال شده است را تعریف می کند"</td> </tr><tr><td>xsl: متن</td> <td>متن را به جریان خروجی تولید می کند ، ویژگی غیرفعال کردن-خروجی-فرار \u003d "بله" یا "نه" را نشان می دهد ، توانایی تولید کاراکترهای ESC را نشان می دهد</td> </tr><tr><td>xsl: مقدار از</td> <td>مقدار گره انتخاب شده را به عنوان متن درج می کند ، ویژگی \u003d "اشاره گر به گره" را انتخاب کنید ، که از آن مقدار گرفته شده است</td> </tr><tr><td>xsl: متغیر</td> <td>مقدار مرزهای متغیر ، نام ویژگی \u003d "نام متغیر" ، انتخاب \u003d "محاسبه مقدار متغیر" را مشخص می کند</td> </tr><tr><td>xsl: with-param</td> <td>یک پارامتر را به قالب اعمال می کند ، نام ویژگی \u003d "نام پارامتر" ، انتخاب \u003d عبارت را برای ارزیابی زمینه فعلی ، مقدار پیش فرض "انتخاب می کند."</td> </tr></tbody></table><h2>نتیجه</h2> <p>در آخر ، لازم به ذکر است که با استفاده از تجزیه کننده استاندارد XML <i>msxml.dll</i>تنها ابزار تجزیه و ایجاد اسناد XML نیست. به عنوان مثال ، برای ایجاد اسناد XML به طور مؤثر از مؤلفه ها استفاده کنید <b>TPageProduser</b>و <b>TableProduser</b>... اما ، این مقاله فقط بر وسعت و کاربرد مدل DOM در عمل تأکید دارد.</p> <p>نویسنده برای انتقادات و پیشنهادات شما در مورد ارتباط موضوع ، محتوای کلی ، شیوه ارائه و همچنین سایر اظهار نظرهای دیگر که در بهبود بیشتر کیفیت نوشتن مجموعه ای از مقالات و انتشار کتابی با عنوان مبحث عملی از استفاده از اسناد XML در تجارت الکترونیکی کمک خواهد کرد ، بسیار سپاسگزار خواهد بود. اطلاعات دقیق تر در مورد جنبه عملی استفاده از اسناد الکترونیکی را می توان در وب سایت نویسنده www.eDocs.al.ru یافت. همچنین برنامه ریزی شده است که متون و نمونه های منبع را در سایت نویسنده قرار دهید.</p> <p>XML به طور فزاینده ای برای ذخیره اطلاعات و تبادل آن بین برنامه ها و وب سایت ها مورد استفاده قرار می گیرد. بسیاری از برنامه ها از این زبان به عنوان زبان اصلی برای ذخیره داده استفاده می کنند ، در حالی که برخی دیگر از آن برای صادرات و وارد کردن داده های XML استفاده می کنند. بنابراین زمان آن فرا رسیده است که توسعه دهندگان در مورد چگونگی استفاده از داده های XML در برنامه های خودشان فکر کنند.</p> <p>در این مقاله ، ما به بررسی XML Object Model Object (DOM) و اجرای مایکروسافت از XML DOM خواهیم پرداخت.</p> <p>XML DOM یک الگوی شیئی است که اشیاء را برای بارگیری و پردازش فایل های XML در اختیار توسعه دهنده قرار می دهد. مدل شی شامل اشیاء اصلی زیر است: XMLDOMDocument ، XMLDOMNodeList ، XMLDOMNode ، XMLDOMNamedNodeMap و XMLDOMParseError. هر یک از این اشیاء (به جز XMLDOMParseError) شامل خواص و روشهایی است که به شما امکان می دهد اطلاعاتی راجع به شیء بدست آورید ، مقادیر و ساختار شیء را دستکاری کنید و به ساختار یک سند XML بروید.</p> <p>بیایید به اشیاء اصلی XML DOM نگاهی بیندازیم و چند نمونه از کاربرد آنها در Borland Delphi را نشان دهیم.</p> <h2> استفاده از XML DOM در Borland Delphi</h2> <p>برای استفاده از Microsoft XML DOM در برنامه های Delphi ، باید کتابخانه نوع مناسب را به پروژه وصل کنید. برای این کار ، دستور Project | را اجرا می کنیم Import Type Library و در کادر گفتگوی Import Type Library ، کتابخانه Microsoft XML نسخه 2.0 (نسخه 2.0) را انتخاب کنید ، که معمولاً در پرونده Windows \\ System \\ MSXML.DLL قرار دارد.</p> <p>پس از کلیک بر روی دکمه ایجاد واحد ، ماژول رابط MSXML_TLB ایجاد خواهد شد که به ما امکان استفاده از اشیاء XML DOM: DOMDocument ، XMLDocument ، XMLHTTPRequest و تعدادی دیگر را می دهد که در کتابخانه MSXML.DLL اجرا شده اند. مراجعه به ماژول MSXML_TLB باید در لیست Uses باشد.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> دستگاه DOM XML</h2> <p>Document Object Model یک سند XML را به عنوان ساختار درخت شاخه ها نشان می دهد. XML DOM API برنامه ها را قادر می سازد تا از درخت سند حرکت کنند و شاخه های آن را دستکاری کنند. هر شاخه می تواند یک نوع خاص (DOMNodeType) داشته باشد ، که براساس آن شاخه های والدین و فرزند تعیین می شود. اکثر اسناد XML حاوی شاخه هایی از عنصر نوع ، ویژگی و متن هستند. ویژگی ها یک نوع خاص از شاخه ها هستند و شاخه های کودک نیستند. صفات با استفاده از روشهای ویژه ارائه شده توسط اشیاء XML DOM دستکاری می شوند.</p> <p>علاوه بر اجرای کنسرسیوم جهانی وب گسترده (W3C) رابط های توصیه شده ، Microsoft XML DOM شامل روشهایی است که از XSL ، الگوهای XSL ، نام های فضایی و انواع داده ها پشتیبانی می کند. به عنوان مثال ، روش SelectNodes به شما امکان می دهد تا از XSL Pattern Syntax استفاده کنید تا شاخه ها را در یک زمینه خاص پیدا کنید ، و روش TransformNode با استفاده از XSL برای انجام تحولات پشتیبانی می کند.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> تست سند XML</h2> <p>به عنوان یک سند XML ، یک فهرست موسیقی CD-ROM را بگیرید که ساختار زیر را دارد:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>امپراطوری بورسیکل باب دیلان ایالات متحده آمریکا کلمبیا 10.90 1985 قلب خود را پنهان کنید بانی تیلور بریتانیا CBS Records 9.90 1988 ... قلبم را رها کن جو کوکر ایالات متحده آمریکا EMI 8.20 1987

اکنون ما با شروع از شی XMLDOMDocument آماده هستیم تا به بررسی مدل شی XML DOM بپردازیم.

XML سند - XMLDOMDocument Object

کار با یک سند XML با بارگیری آن آغاز می شود. برای این کار از روش Load استفاده می کنیم که فقط یک پارامتر دارد که URL سند بارگذاری شده را مشخص می کند. هنگام بارگیری پرونده ها از دیسک محلی ، فقط نام کامل پرونده مشخص می شود (پرونده: /// پروتکل در این حالت قابل حذف نیست). اگر سند XML به صورت رشته ذخیره می شود ، از روش LoadXML برای بارگیری آن سند استفاده کنید.

از ویژگی Async برای کنترل نحوه بارگیری اسناد استفاده می شود (همزمان یا ناهمزمان). به طور پیش فرض ، این ویژگی روی True تنظیم شده است ، نشان می دهد که سند به طور همزمان به صورت همزمان انجام شده است و کنترل قبل از بارگیری کامل سند به برنامه باز می گردد. در غیر اینصورت ، سند بارگیری همزمان می شود و سپس باید مقدار ویژگی ReadyState را بررسی کنید تا ببینید که این سند بارگذاری شده است یا خیر. همچنین می توانید یک کنترل کننده برای رویداد OnReadyStateChange ایجاد کنید که با تغییر مقدار ویژگی ReadyState کنترل را به دست خواهد آورد.

در زیر نحوه بارگیری یک سند XML با استفاده از روش Load نشان داده شده است:

موارد استفاده ... MSXML_TLB ... روش TForm1.Button1 کلیک (ارسال کننده: TObject)؛ var XMLDoc: IXMLDOMDocument؛ شروع XMLDoc: \u003d CoDOMDocument.Create؛ XMLDoc.Async: \u003d نادرست؛ XMLDoc.Load (‘C: \\ DATA \\ DATA.xml ')؛ // // // در اینجاست که کد // سند XML و شاخه های آن را دستکاری می کند // XMLDoc: \u003d Nil؛ پایان؛

پس از بارگیری سند ، می توانیم به خصوصیات آن دسترسی پیدا کنیم. بنابراین ، ویژگی NodeName حاوی مقدار #document خواهد بود ، خاصیت NodeTypeString حاوی مقدار سند خواهد بود ، و خاصیت URL حاوی پرونده خواهد بود: /// C: /DATA/DATA.xml.

خطا در مدیریت

مورد توجه ویژه ای خاصیت های مرتبط با پردازش اسناد هنگام بارگذاری آن است. به عنوان مثال ، ویژگی ParseError یک شی XMLDOMParseError را که حاوی اطلاعات مربوط به خطایی است که هنگام پردازش سند رخ داده است ، بازمی گرداند.

برای نوشتن کنترل کننده خطا می توانید کد زیر را اضافه کنید:

Var XMLError: IXMLDOMParseError؛ ... XMLDoc.Load (‘C: \\ DATA \\ DATA.xml ')؛ XMLError: \u003d XMLDoc.ParseError؛ اگر XMLError.ErrorCode<> 0 سپس // // در اینجا خطا را حل می کنیم // Else Memo1.Lines.Add (XMLDoc.XML)؛ ... XMLDoc: \u003d نیل؛

برای دیدن چه اطلاعاتی در صورت بروز خطا بازگردانده شده ، فهرست فهرست زیر را تغییر دهید:

امپراطوری بورسیکل باب دیلان ایالات متحده آمریکا کلمبیا 10.90 1985

حذف عنصر بسته شدن در خط دوم:</p><p> <CD> <TITLE>امپراطوری بورسیکل <ARTIST>باب دیلان</ARTIST> <COUNTRY>ایالات متحده آمریکا</COUNTRY> <COMPANY>کلمبیا</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>حال بیایید کدی بنویسیم که مقادیر خاصیت XMLDOMParseError شی را برگرداند:</p><p>XMLError: \u003d XMLDoc.ParseError؛ اگر XMLError.ErrorCode<> 0 سپس با XMLError ، Memo1.Lines شروع به افزودن (‘پرونده: + + URL) می کند. افزودن (‘کد: '+ IntToStr (ErrorCode))؛ اضافه کردن ("خطا:" + دلیل)؛ (‘متن: '+ SrcText) را اضافه کنید؛ اضافه کردن ("خط:" + IntToStr (خط))؛ اضافه کردن ("موقعیت:" + IntToStr (LinePos))؛ پایان Else Memo1.Lines.Add (XMLDoc.XML)؛ پایان؛</p><p>و برنامه ما را اجرا کنید در نتیجه ، در مورد خطا اطلاعات زیر را دریافت می کنیم.</p> <p>همانطور که از مثال بالا می بینید ، اطلاعاتی که توسط شی XMLDOMParseError بازگردانده شده اند برای بومی سازی خطا و درک علت وقوع آن کاملاً کافی هستند.</p> <p>اکنون عنصر بسته شدن را بازیابی خواهیم کرد <TITLE> در سند ما و بحث ما درباره XML DOM را ادامه دهید.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> دسترسی به درخت سند</h2> <p>برای دسترسی به درخت سند ، می توانید عنصر ریشه را بدست آورید و سپس در شاخه های کودک آن تکرار کنید ، یا یک شاخه خاص پیدا کنید. در حالت اول ، عنصر ریشه را از طریق ویژگی DocumentElement دریافت می کنیم ، که یک شیء از نوع XMLDOMNode را برمی گرداند. در اینجا نحوه استفاده از ویژگی DocumentElement برای به دست آوردن محتوای هر عنصر کودک آورده شده است:</p><p>گره Var: IXMLDOMNode؛ ریشه: IXMLDOMElement؛ من: علاقه؛ ... ریشه: \u003d XMLDoc.DocumentElement؛ برای I: \u003d 0 به Root.ChildNodes.L طول-1 انجام گره شروع: \u003d Root.ChildNodes.Item [I]؛ Memo1.Lines.Add (Node.Text)؛ پایان؛</p><p>برای سند XML ما متن زیر را دریافت می کنیم.</p> <p>اگر ما علاقه مند به یک شعبه خاص یا شاخه ای در زیر شاخه اول کودک هستیم ، می توانیم از روش NodeFromID یا روش GetElementByTagName از شی XMLDOMDocument استفاده کنیم.</p> <p>روش NodeFromID به یک شناسه منحصر به فرد نیاز دارد همانطور که در XML Schema یا Document Type Definition (DTD) تعریف شده است و به آن شاخه با آن شناسه باز می گردد.</p> <p>روش GetElementByTagName به یک رشته با یک عنصر خاص (برچسب) نیاز دارد و تمام شاخه ها را با این عنصر باز می گرداند. در اینجا نحوه استفاده از این روش برای یافتن همه هنرمندان در فهرست CD-ROM ما آمده است:</p><p>گره ها: IXMLDOMNodeList؛ گره: IXMLDOMNode؛ ... گره ها: \u003d XMLDoc.GetElementsByTagName ("ARTIST")؛ برای I: \u003d 0 تا Nodes.Length-1 do Node Start: \u003d Nodes.Item [I]؛ Memo1.Lines.Add (Node.Text)؛ پایان؛</p><p>برای سند XML ما متن زیر را دریافت خواهیم کرد</p> <p>توجه داشته باشید که روش SelectNodes از XMLDOMNode شیوه ای انعطاف پذیر تر برای دستیابی به شاخه های سند را ارائه می دهد. اما موارد زیر در ادامه</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> شعبه اسناد - XMLDOMNode Object</h2> <p>شی XMLDOMNode یک شاخه سند را نشان می دهد. ما قبلاً هنگام دریافت عنصر اصلی سند با این شیء روبرو شده ایم:</p><p>ریشه: \u003d XMLDoc.DocumentElement؛</p><p>برای به دست آوردن اطلاعات در مورد شاخه ای از یک سند XML ، می توانید از خصوصیات شی XMLDOMNode استفاده کنید (جدول 1).</p> <p>برای دسترسی به داده های ذخیره شده در یک شاخه ، معمولاً استفاده از ویژگی NodeValue (موجود برای ویژگی ها ، شاخه های متن ، نظرات ، دستورالعمل های پردازش و بخش های CDATA) یا خاصیت Text است که محتوای متن شعبه یا ویژگی NodeTypedValue را باز می گرداند. با این حال ، مورد دوم فقط برای شاخه هایی با موارد تایپ شده قابل استفاده است.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> پیمایش درخت سند</h3> <p>شی XMLDOMNode روشهای زیادی برای حرکت به درخت سند ارائه می دهد. به عنوان مثال ، برای دسترسی به شعبه والدین ، \u200b\u200bاز ویژگی ParentNode (نوع XMLDOMNode) ، دسترسی به شعب کودک از طریق خصوصیات ChildNodes (نوع XMLDOMNodeList) ، FirstChild و LastChild (نوع XMLDOMNode) و غیره استفاده کنید. ویژگی OwnerDocument یک شی XMLDOMDocument را که خود سند XML را مشخص می کند ، برمی گرداند. خواص ذکر شده در بالا ، امکان حرکت در درخت سند را آسان می کند.</p> <p>اکنون بیایید بیش از همه شاخه های سند XML تکرار کنیم:</p><p>ریشه: \u003d XMLDoc.DocumentElement؛ برای I: \u003d 0 به Root.ChildNodes.L طول-1 انجام گره شروع: \u003d Root.ChildNodes.Item [I]؛ اگر Node.HasChildNodes سپس GetChilds (گره ، 0)؛ پایان؛</p><p>همانطور که در بالا ذکر شد ، SelectNodes از XMLDOMNode شیوه انعطاف پذیر تری برای دسترسی به شاخه های سند ارائه می دهد. علاوه بر این ، یک روش SelectSingleNode وجود دارد که تنها شاخه اول سند را باز می گرداند. هر دو روش به شما امکان می دهند قالبهای XSL را برای جستجوی شعب تعریف کنید.</p> <p>بیایید روند استفاده از روش SelectNodes را برای واکشی در تمام شعبهایی که دارای یک شعبه سی دی و یک زیر شاخه PRICE هستند ، بررسی کنیم:</p><p>ریشه: \u003d XMLDoc.DocumentElement؛ گره ها: \u003d Root.SelectNodes ("CD / PRICE")؛</p><p>کلیه زیر شاخه های PRICE شعبه CD در مجموعه گره ها قرار می گیرد. ما کمی بعد به بحث در مورد الگوهای XSL باز خواهیم گشت.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> دستکاری شاخه های کودک</h3> <p>برای دستکاری در شاخه های کودک می توانیم از روشهای شی XMLDOMNode استفاده کنیم (جدول 2).</p> <p>برای حذف کامل پرونده در مورد دیسک اول ، باید کد زیر را اجرا کنید:</p><p>Var XMLDoc: IXMLDOMDocument؛ ریشه: IXMLDOMNode؛ گره: IXMLDOMNode؛ XMLDoc: \u003d CoDOMDocument.Create؛ XMLDoc.Async: \u003d نادرست؛ XMLDoc.Load (‘C: \\ DATA \\ DATA.xml ')؛ // ریشه عنصر ریشه را بدست آورید: \u003d XMLDoc.DocumentElement؛ گره: \u003d Root؛ // اولین شاخه کودک Node.RemoveChild (Node.FirstChild) را حذف کنید.</p><p>توجه داشته باشید که در این مثال اولین شاخه کودک را حذف می کنیم. نحوه حذف اولین عنصر اولین شاخه کودک در زیر آورده شده است:</p><p>Var XMLDoc: IXMLDOMDocument؛ ریشه: IXMLDOMNode؛ گره: IXMLDOMNode؛ XMLDoc: \u003d CoDOMDocument.Create؛ XMLDoc.Async: \u003d نادرست؛ XMLDoc.Load (‘C: \\ DATA \\ DATA.xml ')؛ // ریشه عنصر ریشه را بدست آورید: \u003d XMLDoc.DocumentElement؛ // و اولین شاخه کودک Node: \u003d Root.FirstChild؛ // اولین شاخه کودک Node.RemoveChild (Node.FirstChild) را حذف کنید.</p><p>در مثال بالا ، شاخه اول را حذف نکردیم <CD>…</CD>و اولین عنصر شعبه است <TITLE>….

حالا بیایید یک شاخه جدید اضافه کنیم. در زیر کد نشان می دهد که چگونه یک ورودی جدید CD-ROM موسیقی اضافه کنید:

Var NewNode: IXMLDOMNode؛ کودک: IXMLDOMNode؛ ... // ایجاد شعبه جدید - NewNode: \u003d XMLDoc.CreateNode (1 ، "CD" ، ")؛ // اضافه کردن یک عنصر فرزند: \u003d XMLDoc.CreateNode (1 ، "TITLE" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d "Pink Floyd"؛ // اضافه کردن یک عنصر <ARTIST> فرزند: \u003d XMLDoc.CreateNode (1 ، "ARTIST" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d "بخش زنگ"؛ // اضافه کردن یک عنصر <COUNTRY> فرزند: \u003d XMLDoc.CreateNode (1 ، "COUNTRY" ، ")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d "UK"؛ // اضافه کردن یک عنصر <COMPANY> فرزند: \u003d XMLDoc.CreateNode (1 ، "شرکت" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d "EMI Records Ltd."؛ // اضافه کردن یک عنصر <PRICE>فرزند: \u003d XMLDoc.CreateNode (1 ، "PRICE" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن Child را تنظیم کنید. متن: \u003d '11 .99 "؛ // عنصری را اضافه کنید <YEAR> فرزند: \u003d XMLDoc.CreateNode (1 ، "YEAR" ، ‘")؛ // اضافه کردن یک عنصر NewNode.AppendChild (کودک)؛ // و مقدار آن را Child تنظیم کنید. متن: \u003d ‘1994؛ // و یک شاخه Root.AppendChild (NewNode) اضافه کنید. ...</p><p>کد بالا مراحل زیر برای اضافه کردن یک شعبه جدید را نشان می دهد:</p> <ul><li>ایجاد یک شاخه جدید با استفاده از روش CreateNode: <ul><li>ایجاد یک عنصر با استفاده از روش CreateNode؛</li> <li>اضافه کردن یک عنصر به یک شاخه با استفاده از روش AppendChild؛</li> <li>مقدار یک عنصر را از طریق متن متن تنظیم کنید.</li> <li>… برای همه عناصر تکرار کنید.</li> </ul></li> <li>با استفاده از روش AppendChild یک شاخه جدید به سند اضافه کنید.</li> </ul><p>به یاد بیاورید که روش AppendChild شاخه ای به انتهای درخت اضافه می کند. به منظور اضافه کردن شاخه به یک مکان خاص در درخت ، باید از روش InsertBefore استفاده کنید.</p> <h2> مجموعه شعبه - شی XMLDOMNodeList</h2> <p>شیء XMLNodeList شامل لیستی از شعب است که می تواند با استفاده از روش های SelectNodes یا GetElementsByTagName ساخته شود ، و همچنین از ویژگی ChildNodes بدست می آید.</p> <p>قبلاً در مثال ارائه شده در بخش "پیمایش درخت سند" در مورد استفاده از این شیء بحث کرده ایم. در اینجا ما نیز برخی از نظرات نظری را ارائه خواهیم کرد.</p> <p>تعداد شعب موجود در لیست می تواند به عنوان مقدار خاصیت طول به دست آید. شاخه ها از 0 به طول - 1 فهرست بندی می شوند و هر شاخه جداگانه از طریق آیتم نمایه شده مربوطه در آرایه آیتم قابل دسترسی است.</p> <p>حرکت از طریق لیست شعب نیز می تواند با روش NextNode انجام شود ، که شاخه بعدی را در لیست برمی گرداند یا Nil اگر شاخه فعلی آخرین باشد. برای بازگشت به بالای لیست ، با روش Reset تماس بگیرید.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> اسناد را ایجاد و ذخیره کنید</h2> <p>بنابراین ، ما دیدیم که چگونه می توانید شاخه ها و عناصر را به اسناد XML موجود اضافه کنید. حالا بیایید یک سند XML را در پرواز ایجاد کنیم. اول از همه ، به یاد داشته باشید که یک سند می تواند نه تنها از URL ، بلکه از یک رشته معمولی بارگیری شود. موارد زیر نحوه ایجاد یک عنصر ریشه را نشان می دهد ، که می توان از آن برای ساخت پویا بقیه عناصر استفاده کرد (که قبلاً در بخش "دستکاری شاخه های کودک" آنها را پوشش داده ایم):</p><p>Var XMLDoc: IXMLDOMDocument؛ ریشه: IXMLDOMNode؛ گره: IXMLDOMNode؛ S: WideString؛ ... S: \u003d ‘ <CATALOG></CATALOG>'؛ XMLDoc: \u003d CoDOMDocument.Create؛ XMLDoc.Async: \u003d نادرست؛ XMLDoc.LoadXML (S)؛ ریشه: \u003d XMLDoc.DocumentElement؛ گره: \u003d XMLDoc.CreateNode (1 ، "CD" ، ")؛ Root.AppendChild (گره)؛ Memo1.Lines.Add (XMLDoc.XML)؛ ... XMLDoc: \u003d نیل؛</p><p>پس از ساختن سند XML ، آن را با استفاده از روش ذخیره در فایل ذخیره کنید. مثلا:</p> <p>XMLDoc.Save ('C: \\ DATA \\ NEWCD.XML')؛</p> <p>علاوه بر صرفه جویی در پرونده ، روش ذخیره به شما امکان می دهد تا یک سند XML را در یک شی جدید XMLDOMDocument ذخیره کنید. در این حالت ، سند کاملاً پردازش شده و در نتیجه ساختار و نحو آن بررسی می شود. در اینجا نحوه ذخیره یک سند در یک شی دیگر آمده است:</p><p>رویه TForm1.Button2Click (فرستنده: TObject)؛ var XMLDoc2: IXMLDOMDocument؛ شروع XMLDoc2: \u003d CoDOMDocument.Create؛ XMLDoc.Save (XMLDoc2)؛ Memo2.Lines.Add (XMLDoc2.XML)؛ ... XMLDoc2: \u003d نیل؛ پایان؛</p><p>در پایان ، روش ذخیره همچنین به شما امکان می دهد تا سند XML را در سایر اشیاء COM که از رابط های IStream ، IPersistStream یا IPersistStreamInit پشتیبانی می کنند ، ذخیره کنید.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> با استفاده از الگوهای XSL</h2> <p>در بحث در مورد روش SelectNodes از شی XMLDOMNode ، ما ذکر کردیم که روشی انعطاف پذیرتر برای دستیابی به شاخه های سند ارائه می دهد. انعطاف پذیری این است که می توانید یک الگوی XSL را به عنوان معیار انتخاب شعب مشخص کنید. چنین قالب هایی مکانیزم قدرتمندی برای یافتن اطلاعات در اسناد XML ارائه می دهند. به عنوان مثال ، برای دریافت لیستی از تمام عناوین موسیقی CD-ROM در فهرست ما ، می توانید پرس و جو زیر را اجرا کنید:</p><p>برای اطلاع از اینکه دیسک های هنرمندان در ایالات متحده آزاد شدند ، درخواست به شرح زیر است:</p><p>گره ها: \u003d Root.SelectNodes ("CD / ARTIST")؛</p><p>در اینجا نحوه یافتن اولین درایو در یک فهرست آمده است:</p><p>گره ها: \u003d Root.SelectNodes ("CD / TITLE")؛</p><p>و بالاخره:</p><p>گره ها: \u003d Root.SelectNodes ("CD / TITLE")؛</p><p>برای یافتن دیسک های باب دیلن ، می توانید پرس و جو زیر را اجرا کنید:</p><p>گره ها: \u003d Root.SelectNodes (‘CD [$ هر $ ARTIST \u003d" Bob Dylan "] / TITLE")؛</p><p>و برای بدست آوردن لیستی از دیسک های ساخته شده پس از 1985 ، ما پرس و جو زیر را اجرا می کنیم:</p><p>گره ها: \u003d Root.SelectNodes ("CD / TITLE")؛</p><p>بحث مفصل تر درباره نحو XSL نیاز به یک انتشار جداگانه دارد. برای فریب خوانندگان و تشویق تحقیقات بیشتر ، فقط یک مثال کوچک از استفاده احتمالی XSL را بیان می کنم. بیایید بگوییم که باید فروشگاه خود را به یک جدول HTML معمولی تبدیل کنیم. با استفاده از روش های سنتی ، باید بیش از همه شاخه های درخت تکرار شویم و برای هر عنصر دریافت شده ، برچسب های مربوطه را تشکیل دهیم <TD>…</TD>.</p> <p>با استفاده از XSL ، ما به سادگی یک الگوی (یا شیوه نامه) ایجاد می کنیم که مشخص می کند چه چیزی و چطور می توان آن را تغییر داد. سپس ما این الگوی را در فهرست خود قرار می دهیم - و این همان است: ما متن قالب XSL را داریم که کاتالوگ را به یک جدول تبدیل می کند (لیست 2).</p> <p>کد برای پوشش یک الگوی XSL در فهرست ما به این شرح است:</p><p>رویه TForm1.Button2Click (فرستنده: TObject)؛ var XSLDoc: IXMLDOMDocument؛ شروع XSLDoc: \u003d CoDOMDocument.Create؛ XSLDoc.Load (‘C: \\ DATA \\ DATA.xsl ')؛ Memo2.Text: \u003d XMLDoc.TransformNode (XSLDoc)؛ XSLDoc: \u003d نیل؛ پایان؛</p><p>نتیجه گیری از بحث ما در مورد XSL ، باید گفت که در حال حاضر این زبان بطور فعال برای انتقال بین اسناد مختلف XML و همچنین برای قالب بندی اسناد استفاده می شود.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> نتیجه</h2> <p>به دلایل واضح ، پوشاندن کلیه اشیاء DOM Microsoft XML و ارائه نمونه هایی از کاربرد آنها در یک مقاله غیرممکن است. در اینجا ما فقط به موارد اساسی استفاده از XML DOM در برنامه ها پرداختیم. جدول 3 همه اشیاء اجرا شده در Microsoft XML DOM را نشان می دهد.</p> <p>ComputerPress 12 "2000</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> </div> <div class="bsb-wrap bsb-bold bsb-after-post php-mode" data-post-id="4848" data-share-url="/eshhe-odin-nalog-chem-zamenit-nalog-na-modernizatsiyu/"> <div class="bsb-items"> <div class="bsb-item bsb-facebook bsb-no-count" data-id="facebook"> <a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fqipu.ru%2Ffa%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-facebook"></i> <span class="bsb-label">اشتراک گذاری</span> </a> </div> <div class="bsb-item bsb-telegram bsb-no-count" data-id="telegram"> <a href="https://qipu.ru/fa/tg://msg?text=https%3A%2F%2Fqipu.ru%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-telegram"></i> <span class="bsb-label">اشتراک گذاری</span> </a> </div> <div class="bsb-item bsb-twitter bsb-no-count" data-id="twitter"> <a href="https://twitter.com/share?url=https%3A%2F%2Fqipu.ru%2Ffa%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-twitter"></i> <span class="bsb-label">توییت</span> </a> </div> <div class="bsb-item bsb-vkontakte bsb-no-count" data-id="vkontakte"> <a href="https://vk.com/share.php?url=https%3A%2F%2Fqipu.ru%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-vkontakte"></i> <span class="bsb-label">پسندیدن</span> </a> </div> <div class="bsb-item bsb-fb-messenger bsb-no-count" data-id="fb-messenger"> <a href="https://qipu.ru/fa/fb-messenger://share/?link=https%3A%2F%2Fqipu.ru%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-fb-messenger"></i> <span class="bsb-label">پسندیدن</span> </a> </div> </div> </div> </div> </div> </article> <section class="section-carousel"> <div class="post-carousel"> <h3 class="title-block">همچنین بخوانید</h3> <div class="owl-container owl-loop" data-columns="3" data-padding="20"> <div class="owl-carousel"> <article class="post- post type-post status-publish format-standard has-post-thumbnail hentry category-morning-news"> <div class="post-thumbnail"> <img width="720" height="378" src="/uploads/21bdb89907abffe2b99c0b5b23f46545.jpg" class="attachment-md size-md wp-post-image" alt="فایل های برنامه iOS چه پسوندی دارند؟" / loading=lazy> <div class="post-more"><a href="https://qipu.ru/fa/megafon/rasshirenie-prilozhenii-dlya-iphone-kakoe-rasshirenie-imeyut-faily.html" class="btn-link" data-wpel-link="internal"><span>خواندن</span></a></div> <ul class="post-meta"></ul> <a href="https://qipu.ru/fa/megafon/rasshirenie-prilozhenii-dlya-iphone-kakoe-rasshirenie-imeyut-faily.html" data-wpel-link="internal"></a> </div> <h2 class="entry-title"><a href="https://qipu.ru/fa/megafon/rasshirenie-prilozhenii-dlya-iphone-kakoe-rasshirenie-imeyut-faily.html" data-wpel-link="internal">فایل های برنامه iOS چه پسوندی دارند؟</a></h2> <ul class="post-meta"> <li class="meta-date"> <time class="entry-date published updated" datetime=""> 13.08.2020 </time> </li> </ul> </article> <!-- /next_post --> <article class="post- post type-post status-publish format-standard has-post-thumbnail hentry category-morning-news"> <div class="post-thumbnail"> <img width="720" height="378" src="/uploads/95e52a248bd0f4939d9ea107b8b342e2.jpg" class="attachment-md size-md wp-post-image" alt="نحوه باز کردن بایگانی های ZIP بر روی آیفون" / loading=lazy> <div class="post-more"><a href="https://qipu.ru/fa/megafon/papka-faily-na-aifone-kak-otkryvat-zip-arhivy-na-iphone-kak-skinut.html" class="btn-link" data-wpel-link="internal"><span>خواندن</span></a></div> <ul class="post-meta"></ul> <a href="https://qipu.ru/fa/megafon/papka-faily-na-aifone-kak-otkryvat-zip-arhivy-na-iphone-kak-skinut.html" data-wpel-link="internal"></a> </div> <h2 class="entry-title"><a href="https://qipu.ru/fa/megafon/papka-faily-na-aifone-kak-otkryvat-zip-arhivy-na-iphone-kak-skinut.html" data-wpel-link="internal">نحوه باز کردن بایگانی های ZIP بر روی آیفون</a></h2> <ul class="post-meta"> <li class="meta-date"> <time class="entry-date published updated" datetime=""> 13.08.2020 </time> </li> </ul> </article> <!-- /next_post --> <article class="post- post type-post status-publish format-standard has-post-thumbnail hentry category-morning-news"> <div class="post-thumbnail"> <img width="720" height="378" src="/uploads/887ddd47ad4e0418a9861c79196d2741.jpg" class="attachment-md size-md wp-post-image" alt="دسترسی خصوصی در دسترسی خصوصی به صفری در رایانه چیست؟" / loading=lazy> <div class="post-more"><a href="https://qipu.ru/fa/bilajjn/kak-bystro-vklyuchit-ili-otklyuchit-chastnyi-dostup-v-safari-chto-takoe-chastnyi.html" class="btn-link" data-wpel-link="internal"><span>خواندن</span></a></div> <ul class="post-meta"></ul> <a href="https://qipu.ru/fa/bilajjn/kak-bystro-vklyuchit-ili-otklyuchit-chastnyi-dostup-v-safari-chto-takoe-chastnyi.html" data-wpel-link="internal"></a> </div> <h2 class="entry-title"><a href="https://qipu.ru/fa/bilajjn/kak-bystro-vklyuchit-ili-otklyuchit-chastnyi-dostup-v-safari-chto-takoe-chastnyi.html" data-wpel-link="internal">دسترسی خصوصی در دسترسی خصوصی به صفری در رایانه چیست؟</a></h2> <ul class="post-meta"> <li class="meta-date"> <time class="entry-date published updated" datetime=""> 13.08.2020 </time> </li> </ul> </article> <!-- /next_post --> </div> <div class="owl-dots"></div> </div> </div> </section> </main> </div> </div> </div> </div> <footer class="site-footer"> <style> .footer-section { width: 830px; margin: 0 auto; padding: 0; font-family: 'Noto Sans', sans-serif; } .site-footer { background-color: #222; } @media (max-width: 1025px) { .footer-section { max-width: 690px; } } @media (max-width: 760px) { .footer-section { width: 90%; } } .site-footer a:hover { color: #FF3400; } .white-a { color: #969696!important; } .white-a:hover { color: #fff!important; } .white-a:hover g { opacity: 1; } </style> <div class="footer-section"> <div class="footer" > <div class="footer__menu"> <div class="footer__menu__logo" style="background:none;"><img src="/logo.png" loading=lazy></div> <ul> <li><a href="https://qipu.ru/fa/category/bilajjn/">بیلین</a></li> <li><a href="https://qipu.ru/fa/category/megafon/">مگافون</a></li> <li><a href="https://qipu.ru/fa/category/mobilnye-sovety/">نکات موبایل</a></li> <li><a href="https://qipu.ru/fa/category/mts/">م</a></li> </ul> <ul> <li><a href="https://qipu.ru/fa/category/tele2/">TELE 2</a></li> <li><a href="https://qipu.ru/fa/category/yota/">یوتا</a></li> <li><a href="https://qipu.ru/fa/category/bilajjn/">بیلین</a></li> <li><a href="https://qipu.ru/fa/category/megafon/">مگافون</a></li> </ul> </div> <div class="footer__social"> <a href="https://facebook.com/" target="_blank" class="footer__social--facebook white-a" data-wpel-link="external"></a> <a href="https://twitter.com/" target="_blank" class="footer__social--tw white-a" data-wpel-link="external"></a> <a href="" target="_blank" class="footer__social--vk white-a" data-wpel-link="external"></a> <a href="https://youtube.com/" target="_blank" class="footer__social--yt white-a" data-wpel-link="external"></a> </div> <div class="footer__info" > <p>© qipu.ru، 2020. دستیار شخصی در دنیای ارتباطات سلولی <br> .</p> </div> </div> </div> </footer> </div> </div> <a href="https://qipu.ru/fa/#top" class="scroll-to-top hidden-sm-down" data-wpel-link="internal"></a> <div class="site-search" id="search"> <button type="button" class="close"></button> <div class="form-container"> <div class="container"> <div class="row"> <div class="col-lg-6 offset-lg-3"> <form role="search" method="get" class="search-form form" action="/"> <label class="sr-only">جستجو برای:</label> <div class="input-group"> <input type="search" value="" name="s" class="search-field form-control" placeholder="دنبال چی میگردی؟" required> <span class="input-group-btn"> <button type="submit" class="search-submit btn btn-primary btn-effect"><span>جستجو کردن</span><span><i class="icon icon-search"></i></span></button> </span> </div> </form> <p>کلمات کلیدی خود را وارد کنید</p> </div> </div> </div> </div> </div> <style type="text/css"> .wpmchimpa-overlay-bg.wpmchimpselector { display: none; top: 0; left: 0; height:100%; width: 100%; cursor: pointer; z-index: 999999; background: #000; background: rgba(0,0,0,0.40); background:rgba(0,0,0,0.7);cursor: default; position: fixed!important; } .wpmchimpa-overlay-bg #wpmchimpa-main *{ transition: all 0.5s ease; } .wpmchimpa-overlay-bg .wpmchimpa-mainc, .wpmchimpa-overlay-bg .wpmchimpa-maina{ -webkit-transform: translate(0,0); height:100%;} .wpmchimpa-overlay-bg #wpmchimpa-main { position: absolute; top: 50%; left: 50%; border-radius: 2px; -webkit-transform: translate(-50%, -50%); -moz-transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%); -o-transform: translate(-50%, -50%); transform: translate(-50%, -50%); width: calc(100% - 20px); max-width:650px; background: #27313B; text-align: center; background-color:#ffffff;} #wpmchimpa-main #wpmchimpa-newsletterform{ } #wpmchimpa-main #wpmchimpa{ width: calc(100% - 20px); max-width: 400px; margin: 0 auto; } #wpmchimpa div{ position:relative; } #wpmchimpa h3{ line-height: 24px; margin-top:20px; color: #F4233C; font-size: 24px; font-family:Tahoma, Geneva, sans-serif;font-size:35px;line-height:35px;font-weight:normal;font-style:normal;color:#f34b38;} #wpmchimpa .wpmchimpa_para{ margin-top: 15px; } #wpmchimpa .wpmchimpa_para,#wpmchimpa .wpmchimpa_para * { font-size: 15px; color: #959595; font-family:Tahoma, Geneva, sans-serif;font-size:15px;} #wpmchimpa form{ margin: 20px auto; } #wpmchimpa .formbox > div:first-of-type{ width: 65%; float: left; } #wpmchimpa .formbox > div:first-of-type + div{ width: 35%; float: left; text-align: center; } #wpmchimpa .formbox input[type="text"]{ border-radius: 3px 0 0 3px; } #wpmchimpa .wpmchimpa-field{ position: relative; width:100%; margin: 0 auto 10px auto; text-align: left; } #wpmchimpa .inputicon{ display: none; } #wpmchimpa .wpmc-ficon .inputicon { display: block; width: 40px; height: 40px; position: absolute; top: 0; left: 0; pointer-events: none; } #wpmchimpa .wpmc-ficon input[type="text"], #wpmchimpa .wpmc-ficon input[type="text"] ~ .inputlabel{ padding-left: 40px; } #wpmchimpa .wpmc-ficon [wpmcfield="email"] ~ .inputicon { background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMzZDNkM2QiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTUxMiwzODRjMCwxMS4yMTktMy4xNTYsMjEuNjI1LTguMjE5LDMwLjc4MUwzNDIuMTI1LDIzMy45MDZMNTAyLjAzMSw5NGM2LjIxOSw5Ljg3NSw5Ljk2OSwyMS40NjksOS45NjksMzRWMzg0eiBNMjU2LDI2Ni43NUw0NzguNSw3Mi4wNjNjLTkuMTI1LTUtMTkuNDA2LTguMDYzLTMwLjUtOC4wNjNINjRjLTExLjEwOSwwLTIxLjM5MSwzLjA2My0zMC40ODQsOC4wNjNMMjU2LDI2Ni43NXogTTMxOC4wMzEsMjU0Ljk2OSBsLTUxLjUsNDUuMDk0QzI2My41MTYsMzAyLjY4OCwyNTkuNzY2LDMwNCwyNTYsMzA0cy03LjUxNi0xLjMxMy0xMC41MzEtMy45MzhsLTUxLjUxNi00NS4wOTRMMzAuMjUsNDM4LjE1NiBDNDAuMDYzLDQ0NC4zMTMsNTEuNTYzLDQ0OCw2NCw0NDhoMzg0YzEyLjQzOCwwLDIzLjkzOC0zLjY4OCwzMy43NS05Ljg0NEwzMTguMDMxLDI1NC45Njl6IE05Ljk2OSw5NEMzLjc1LDEwMy44NzUsMCwxMTUuNDY5LDAsMTI4IHYyNTZjMCwxMS4yMTksMy4xNDEsMjEuNjI1LDguMjE5LDMwLjc4MWwxNjEuNjQxLTE4MC45MDZMOS45NjksOTR6Ii8+PC9zdmc+') no-repeat center} #wpmchimpa .wpmc-ficon [wpmcfield="FNAME"] ~ .inputicon { background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMzZDNkM2QiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNjEyIDYxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjEyIDYxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PHBhdGggZD0iTTMwNi4wMDEsMzI1Ljk4OGM5MC41NjMtMC4wMDUsMTIzLjE0Ny05MC42ODIsMTMxLjY3OS0xNjUuMTY3QzQ0OC4xODgsNjkuMDYsNDA0Ljc5OSwwLDMwNi4wMDEsMCBjLTk4Ljc4MiwwLTE0Mi4xOTUsNjkuMDU1LTEzMS42NzksMTYwLjgyQzE4Mi44NjIsMjM1LjMwNCwyMTUuNDM2LDMyNS45OTUsMzA2LjAwMSwzMjUuOTg4eiIvPjxwYXRoIGQ9Ik01NTAuOTgxLDU0MS45MDhjLTAuOTktMjguOTA0LTQuMzc3LTU3LjkzOS05LjQyMS04Ni4zOTNjLTYuMTExLTM0LjQ2OS0xMy44ODktODUuMDAyLTQzLjk4My0xMDcuNDY1IGMtMTcuNDA0LTEyLjk4OC0zOS45NDEtMTcuMjQ5LTU5Ljg2NS0yNS4wODFjLTkuNjk3LTMuODEtMTguMzg0LTcuNTk0LTI2LjUzNy0xMS45MDFjLTI3LjUxOCwzMC4xNzYtNjMuNCw0NS45NjItMTA1LjE4Niw0NS45NjQgYy00MS43NzQsMC03Ny42NTItMTUuNzg2LTEwNS4xNjctNDUuOTY0Yy04LjE1Myw0LjMwOC0xNi44NCw4LjA5My0yNi41MzcsMTEuOTAxYy0xOS45MjQsNy44MzItNDIuNDYxLDEyLjA5Mi01OS44NjMsMjUuMDgxIGMtMzAuMDk2LDIyLjQ2My0zNy44NzMsNzIuOTk2LTQzLjk4MywxMDcuNDY1Yy01LjA0NSwyOC40NTQtOC40MzMsNTcuNDg5LTkuNDIyLDg2LjM5MwljLTAuNzY2LDIyLjM4NywxMC4yODgsMjUuNTI1LDI5LjAxNywzMi4yODRjMjMuNDUzLDguNDU4LDQ3LjY2NiwxNC43MzcsNzIuMDQxLDE5Ljg4NGM0Ny4wNzcsOS45NDEsOTUuNjAzLDE3LjU4MiwxNDMuOTIxLDE3LjkyNCBjNDguMzE4LTAuMzQzLDk2Ljg0NC03Ljk4MywxNDMuOTIxLTE3LjkyNGMyNC4zNzUtNS4xNDUsNDguNTktMTEuNDI0LDcyLjA0MS0xOS44ODQJQzU0MC42OTQsNTY3LjQzNSw1NTEuNzQ3LDU2NC4yOTcsNTUwLjk4MSw1NDEuOTA4eiIvPjwvZz48L3N2Zz4=') no-repeat center} #wpmchimpa .wpmc-ficon [wpmcfield="LNAME"] ~ .inputicon { background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMzZDNkM2QiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNjEyIDYxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjEyIDYxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PHBhdGggZD0iTTMwNi4wMDEsMzI1Ljk4OGM5MC41NjMtMC4wMDUsMTIzLjE0Ny05MC42ODIsMTMxLjY3OS0xNjUuMTY3QzQ0OC4xODgsNjkuMDYsNDA0Ljc5OSwwLDMwNi4wMDEsMCBjLTk4Ljc4MiwwLTE0Mi4xOTUsNjkuMDU1LTEzMS42NzksMTYwLjgyQzE4Mi44NjIsMjM1LjMwNCwyMTUuNDM2LDMyNS45OTUsMzA2LjAwMSwzMjUuOTg4eiIvPjxwYXRoIGQ9Ik01NTAuOTgxLDU0MS45MDhjLTAuOTktMjguOTA0LTQuMzc3LTU3LjkzOS05LjQyMS04Ni4zOTNjLTYuMTExLTM0LjQ2OS0xMy44ODktODUuMDAyLTQzLjk4My0xMDcuNDY1IGMtMTcuNDA0LTEyLjk4OC0zOS45NDEtMTcuMjQ5LTU5Ljg2NS0yNS4wODFjLTkuNjk3LTMuODEtMTguMzg0LTcuNTk0LTI2LjUzNy0xMS45MDFjLTI3LjUxOCwzMC4xNzYtNjMuNCw0NS45NjItMTA1LjE4Niw0NS45NjQgYy00MS43NzQsMC03Ny42NTItMTUuNzg2LTEwNS4xNjctNDUuOTY0Yy04LjE1Myw0LjMwOC0xNi44NCw4LjA5My0yNi41MzcsMTEuOTAxYy0xOS45MjQsNy44MzItNDIuNDYxLDEyLjA5Mi01OS44NjMsMjUuMDgxIGMtMzAuMDk2LDIyLjQ2My0zNy44NzMsNzIuOTk2LTQzLjk4MywxMDcuNDY1Yy01LjA0NSwyOC40NTQtOC40MzMsNTcuNDg5LTkuNDIyLDg2LjM5MwljLTAuNzY2LDIyLjM4NywxMC4yODgsMjUuNTI1LDI5LjAxNywzMi4yODRjMjMuNDUzLDguNDU4LDQ3LjY2NiwxNC43MzcsNzIuMDQxLDE5Ljg4NGM0Ny4wNzcsOS45NDEsOTUuNjAzLDE3LjU4MiwxNDMuOTIxLDE3LjkyNCBjNDguMzE4LTAuMzQzLDk2Ljg0NC03Ljk4MywxNDMuOTIxLTE3LjkyNGMyNC4zNzUtNS4xNDUsNDguNTktMTEuNDI0LDcyLjA0MS0xOS44ODQJQzU0MC42OTQsNTY3LjQzNSw1NTEuNzQ3LDU2NC4yOTcsNTUwLjk4MSw1NDEuOTA4eiIvPjwvZz48L3N2Zz4=') no-repeat center} #wpmchimpa .wpmchimpa-field textarea, #wpmchimpa .wpmchimpa-field select, #wpmchimpa input[type="text"]{ text-align: left; width: 100%; height: 40px; border-radius:3px; background: #fff; padding: 0 10px; color: #353535; font-size:17px; outline:0; display: block; border: 1px solid #efefef; font-family:Tahoma, Geneva, sans-serif;font-size:15px;color:#696565;} #wpmchimpa .wpmchimpa-field.wpmchimpa-multidrop select{ height: 100px; } #wpmchimpa .wpmchimpa-field.wpmchimpa-drop:before{ content: ''; width: 40px; height: 40px; position: absolute; right: 0; top: 0; pointer-events: none; background: no-repeat center; background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwMDAiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgOTQuODU5IDk0Ljg1OSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgOTQuODU5IDk0Ljg1OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTE3LjMxMiw0MS43NTdoNjAuMjM2YzAuNzcsMCwxLjQ2OS0wLjQ0LDEuODAyLTEuMTMzYzAuMzM0LTAuNjkxLDAuMjQxLTEuNTE0LTAuMjM3LTIuMTE0TDQ4Ljk5NCwwLjc1MyBDNDguNjE0LDAuMjc3LDQ4LjAzOSwwLDQ3LjQzMSwwcy0xLjE4NCwwLjI3Ny0xLjU2MywwLjc1M0wxNS43NDgsMzguNTFjLTAuNDc5LDAuNjAxLTAuNTcyLDEuNDIzLTAuMjM4LDIuMTE0IEMxNS44NDMsNDEuMzE3LDE2LjU0Miw0MS43NTcsMTcuMzEyLDQxLjc1N3oiLz4gPHBhdGggZD0iTTc3LjU0Nyw1My4xMDJIMTcuMzEyYy0wLjc2OSwwLTEuNDY5LDAuNDM5LTEuODAyLDEuMTMzYy0wLjMzNCwwLjY5MS0wLjI0MSwxLjUxNCwwLjIzOCwyLjExM2wzMC4xMTksMzcuNzU4IGMwLjM4LDAuNDc2LDAuOTU1LDAuNzUzLDEuNTYzLDAuNzUzczEuMTg0LTAuMjc3LDEuNTYzLTAuNzUzTDc5LjExLDU2LjM0OGMwLjQ3OS0wLjYwMSwwLjU3MS0xLjQyMiwwLjIzNy0yLjExMyBDNzkuMDE2LDUzLjU0MSw3OC4zMTcsNTMuMTAyLDc3LjU0Nyw1My4xMDJ6Ii8+PC9zdmc+'); } #wpmchimpa input[type="text"] ~ .inputlabel{ position: absolute; top: 0; left: 0; right: 0; pointer-events: none; width: 100%; line-height: 40px; color: rgba(0,0,0,0.6); font-size: 17px; font-weight:500; padding: 0 10px; white-space: nowrap; font-family:Tahoma, Geneva, sans-serif;font-size:15px;color:#696565;} #wpmchimpa input[type="text"]:valid + .inputlabel{ display: none; } #wpmchimpa select.wpmcerror, #wpmchimpa input[type="text"].wpmcerror{ border-color: red; } #wpmchimpa .wpmchimpa-check, #wpmchimpa .wpmchimpa-radio{ clear: both; } #wpmchimpa .wpmchimpa-check *, #wpmchimpa .wpmchimpa-radio *{ color: #fff; font-family:Tahoma, Geneva, sans-serif;font-size:14px;font-weight:normal;font-style:normal;color:#3d3d3d;} #wpmchimpa .wpmchimpa-item{ width:100%; display: inline-block; vertical-align: top; } #wpmchimpa .wpmchimpa-item input { display: none; } #wpmchimpa .wpmchimpa-item span { cursor: pointer; display: inline-block; position: relative; padding-left: 35px; line-height: 20px; margin-right: 10px; } #wpmchimpa .wpmchimpa-item span:before, #wpmchimpa .wpmchimpa-item span:after { content: ''; display: inline-block; width: 12px; height: 12px; left: 0; top: 4px; position: absolute; } #wpmchimpa .wpmchimpa-item span:before { border:1px solid #ccc; border-radius: 1px; background-color: #fff; -webkit-transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out; border: 1px solid#f34b38;background: #ffffff;} #wpmchimpa .wpmchimpa-item input[type='checkbox'] + span:hover:after, #wpmchimpa input[type='checkbox']:checked + span:after { content:''; width: 14px; height: 14px; background: no-repeat center; background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwMDAwMDAiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iOHB4IiBoZWlnaHQ9IjhweCIgdmlld0JveD0iMCAwIDIzMCAyMzAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDIzMCAyMzAiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGQ9Ik05Mi4zNTYsMjIzLjU0OWM3LjQxLDcuNSwyMy45MTQsNS4wMTQsMjUuNjkxLTYuNzc5YzExLjA1Ni03My4yMTcsNjYuMzc4LTEzNC45ODUsMTA4LjI0My0xOTMuMTg5IEMyMzcuODk4LDcuNDUyLDIxMS4yMDctNy44NywxOTkuNzUsOC4wNjdDMTYxLjQ5Myw2MS4yNDksMTEzLjI3NCwxMTcuMjEsOTQuNDEsMTgxLjc0NCBjLTIxLjU1Ny0yMi4wMzEtNDMuMjAxLTQzLjg1My02Ny4zNzktNjMuMjEyYy0xNS4zMTItMTIuMjY1LTM3LjIxNSw5LjM0My0yMS43MzgsMjEuNzM3IEMzNi43OTQsMTY1LjUwMSw2NC4wMTcsMTk0LjkyNCw5Mi4zNTYsMjIzLjU0OXoiLz48L3N2Zz4='); } #wpmchimpa .wpmchimpa-item input[type='checkbox']:not(:checked) + span:hover:after { opacity: 0.5; } #wpmchimpa .wpmchimpa-item input[type='radio'] + span:before { border-radius: 50%; width: 12px; height: 12px; top: 4px; } #wpmchimpa input[type='radio']:checked + span:after { background: #000000; width: 8px; height: 8px; top: 6px; left: 2px; border-radius: 50%; } #wpmchimpa .wpmcinfierr{ display: block; height: 10px; text-align: left; line-height: 10px; margin-bottom: -10px; font-size: 10px; color: red; pointer-events: none; font-family:Tahoma, Geneva, sans-serif;} #wpmchimpa .wpmchimpa-subs-button{ border-radius: 0 3px 3px 0; width: 100%; color: #fff; font-size: 17px; border: 1px solid #FA0B38; background-color: #FF1F43; height: 40px; line-height: 40px; text-align: center; cursor: pointer; position: relative; top: 0; font-family:Tahoma, Geneva, sans-serif;font-size:16px;font-weight:normal;font-style:normal;color:#ffffff;background-color:#f34b38;} #wpmchimpa .wpmchimpa-subs-button::before{ content: 'Подписаться'; } #wpmchimpa .wpmchimpa-subs-button:hover{ background-color: #FA0B38; color:#ffffff;background-color:#75c462;} #wpmchimpa .wpmchimpa-subs-button.subsicon:before{ padding-left: 40px; } #wpmchimpa .wpmchimpa-subs-button.subsicon::after{ content:''; position: absolute; height: 40px; width: 40px; top: 0; left: 0; pointer-events: none; } .wpmchimpa-overlay-bg.signalshow .wpmchimpa-subs-button::after, .wpmchimpa-overlay-bg.signalshow .wpmchimpa-subs-button::before{ display: none; } #wpmchimpa-main .wpmchimpa-signal { display: none; z-index: 1; top: 5px; left: calc(50% - 20px); position: absolute; -webkit-transform: scale(0.8); -ms-transform: scale(0.8); transform: scale(0.8); } .wpmchimpa-overlay-bg.signalshow #wpmchimpa-main .wpmchimpa-signal { display: inline-block; } #wpmchimpa-main .wpmchimpa-feedback{ text-align: center; position: relative; color: #ccc; font-size: 10px; height: 12px; margin-top: -12px; font-family:Tahoma, Geneva, sans-serif;color:#3d3d3d;} #wpmchimpa-main .wpmchimpa-tag{ margin: 5px auto; } #wpmchimpa-main .wpmchimpa-tag, #wpmchimpa-main .wpmchimpa-tag *{ color:#fff; font-size: 10px; font-family:Tahoma, Geneva, sans-serif;font-size:10px;color:#3d3d3d;} #wpmchimpa-main .wpmchimpa-tag:before{ content:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMzZDNkM2QiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTBweCIgaGVpZ2h0PSIxMHB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTQxNy41NjYsMjA5LjgzaC05LjQ4NHYtNDQuMzg4YzAtODIuMDk5LTY1LjE1MS0xNTAuNjgxLTE0Ni41ODItMTUyLjE0NWMtMi4yMjQtMC4wNC02LjY3MS0wLjA0LTguODk1LDAgYy04MS40MzIsMS40NjQtMTQ2LjU4Miw3MC4wNDYtMTQ2LjU4MiwxNTIuMTQ1djQ0LjM4OGgtOS40ODVDODEuOTIyLDIwOS44Myw3MCwyMjQuOTEyLDcwLDI0My41Mzl2MjIyLjYzMiAgQzcwLDQ4NC43NzcsODEuOTIyLDUwMCw5Ni41MzksNTAwaDMyMS4wMjhjMTQuNjE3LDAsMjYuNTM5LTE1LjIyMywyNi41MzktMzMuODI5VjI0My41MzkgIEM0NDQuMTA1LDIyNC45MTIsNDMyLjE4NCwyMDkuODMsNDE3LjU2NiwyMDkuODN6IE0yODcuMTI5LDM1NC42Mjl2NjcuMjdjMCw3LjcwNC02LjQ0OSwxNC4yMjItMTQuMTU5LDE0LjIyMmgtMzEuODM0ICBjLTcuNzEsMC0xNC4xNTktNi41MTgtMTQuMTU5LTE0LjIyMnYtNjcuMjdjLTcuNDc3LTcuMzYxLTExLjgzLTE3LjUzNy0xMS44My0yOC43OTVjMC0yMS4zMzQsMTYuNDkxLTM5LjY2NiwzNy40NTktNDAuNTEyICBjMi4yMjItMC4wOSw2LjY3My0wLjA5LDguODk1LDBjMjAuOTY4LDAuODQ2LDM3LjQ1OSwxOS4xNzgsMzcuNDU5LDQwLjUxMkMyOTguOTU5LDMzNy4wOTIsMjk0LjYwNSwzNDcuMjY4LDI4Ny4xMjksMzU0LjYyOXogTTM0NS41NzIsMjA5LjgzSDI2MS41aC04Ljg5NWgtODQuMDcydi00NC4zODhjMC00OC45MDUsMzkuNzQ0LTg5LjM0Miw4OC41MTktODkuMzQyczg4LjUyLDQwLjQzNyw4OC41Miw4OS4zNDJWMjA5LjgzeiIvPjwvc3ZnPg=='); margin: 5px; top: 1px; position:relative; } #wpmchimpa-main .wpmchimpa-social{ display: inline-block; margin: 12px auto 0; height: 90px; width: 100%; background: rgba(75, 75, 75, 0.3); box-shadow: 0px 1px 1px 1px rgba(116, 116, 116, 0.94); } #wpmchimpa-main .wpmchimpa-social::before{ content: 'Subscribe with'; font-size: 13px; color: #ADACB2; width: 100%; display: block; margin: 15px auto 5px; } #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc{ display: inline-block; width:40px; height: 40px; border-radius: 2px; cursor: pointer; -webkit-transition: all 0.1s ease; transition: all 0.1s ease; -webkit-backface-visibility:hidden; border:1px solid #262E43; border-color: #ffffff;} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc::before{ content: ''; display: block; width:40px; height: 40px; background: no-repeat center; } #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-fb { display:none;} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-fb::before { background-image:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTI5Ni4yOTYsNTEySDIwMC4zNlYyNTZoLTY0di04OC4yMjVsNjQtMC4wMjlsLTAuMTA0LTUxLjk3NkMyMDAuMjU2LDQzLjc5NCwyMTkuNzczLDAsMzA0LjU1NiwwaDcwLjU4OHY4OC4yNDJoLTQ0LjExNSBjLTMzLjAxNiwwLTM0LjYwNCwxMi4zMjgtMzQuNjA0LDM1LjM0MmwtMC4xMzEsNDQuMTYyaDc5LjM0NmwtOS4zNTQsODguMjI1TDI5Ni4zNiwyNTZMMjk2LjI5Niw1MTJ6Ii8+PC9zdmc+')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-fb:hover:before { background-image:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMyZDYwOWIiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTI5Ni4yOTYsNTEySDIwMC4zNlYyNTZoLTY0di04OC4yMjVsNjQtMC4wMjlsLTAuMTA0LTUxLjk3NkMyMDAuMjU2LDQzLjc5NCwyMTkuNzczLDAsMzA0LjU1NiwwaDcwLjU4OHY4OC4yNDJoLTQ0LjExNSBjLTMzLjAxNiwwLTM0LjYwNCwxMi4zMjgtMzQuNjA0LDM1LjM0MmwtMC4xMzEsNDQuMTYyaDc5LjM0NmwtOS4zNTQsODguMjI1TDI5Ni4zNiwyNTZMMjk2LjI5Niw1MTJ6Ii8+PC9zdmc+')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-gp { display:none;} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-gp:before { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTI3My4zNzIsMzAyLjQ5OGMtNS4wNDEtNi43NjItMTAuNjA4LTEzLjA0NS0xNi43LTE4Ljg0MmMtNi4wOTEtNS44MDQtMTIuMTgzLTExLjA4OC0xOC4yNzEtMTUuODQ1IGMtNi4wOTItNC43NTctMTEuNjU5LTkuMzI5LTE2LjcwMi0xMy43MDljLTUuMDQyLTQuMzc0LTkuMTM1LTguOTQ1LTEyLjI3NS0xMy43MDJjLTMuMTQtNC43NTctNC43MTEtOS42MS00LjcxMS0xNC41NTggYzAtNi44NTUsMi4xOS0xMy4yNzgsNi41NjctMTkuMjc0YzQuMzc3LTUuOTk2LDkuNzA3LTExLjc5OSwxNS45ODYtMTcuNDE3YzYuMjgtNS42MTcsMTIuNTU5LTExLjc1MywxOC44NDQtMTguNDE1IGM2LjI3Ni02LjY2NSwxMS42MDQtMTUuNDY1LDE1Ljk4NS0yNi40MTJjNC4zNzMtMTAuOTQ0LDYuNTYzLTIzLjQ1OCw2LjU2My0zNy41NDJjMC0xNi43NS0zLjcxMy0zMi44MzUtMTEuMTM2LTQ4LjI1IGMtNy40MjMtMTUuNDE4LTE3Ljg5LTI3LjQxMi0zMS40MDUtMzUuOTc2aDM4LjU0TDMwMy4yLDBIMTc4LjQ0MWMtMTcuNjk5LDAtMzUuNDk4LDEuOTA2LTUzLjM4NCw1LjcyIGMtMjYuNDUzLDUuOS00OC43MjMsMTkuMzY4LTY2LjgwNiw0MC4zOTdDNDAuMTcxLDY3LjE1LDMxLjEyOSw5MC45OSwzMS4xMjksMTE3LjYzN2MwLDI4LjE3MSwxMC4xMzgsNTEuNTgzLDMwLjQwNiw3MC4yMzMgYzIwLjI2OSwxOC42NDksNDQuNTg1LDI3Ljk3OCw3Mi45NDUsMjcuOTc4YzUuNzEsMCwxMi4zNzEtMC40NzgsMTkuOTg1LTEuNDI3Yy0wLjM4MSwxLjUyMS0xLjA0MywzLjU2Ny0xLjk5Nyw2LjEzNiBzLTEuNzE1LDQuNjItMi4yODYsNi4xNGMtMC41NywxLjUyMS0xLjA0NywzLjM3NS0xLjQyNSw1LjU2NmMtMC4zODIsMi4xOS0wLjU3MSw0LjQyOC0wLjU3MSw2LjcxIGMwLDEyLjU2Myw2LjA4NiwyNi43NDQsMTguMjcxLDQyLjU0MWMtMTQuNDY1LDAuMzg3LTI4LjczNywxLjY3LTQyLjgyNSwzLjg2Yy0xNC4wODQsMi4xOS0yOC44MzMsNS42MTYtNDQuMjUyLDEwLjI4IGMtMTUuNDE3LDQuNjYxLTI5LjIxNywxMS40Mi00MS4zOTYsMjAuMjdjLTEyLjE4Miw4Ljg1NC0yMS4zMTcsMTkuMzY2LTI3LjQwOCwzMS41NDlDMy41MzMsMzYxLjU1OSwwLjAxLDM3NC40MDUsMC4wMSwzODYuMDE3IGMwLDEyLjc1MSwyLjg1NywyNC4zMTQsOC41NjUsMzQuNjljNS43MDgsMTAuMzY5LDEzLjAzNSwxOC44NDIsMjEuOTgyLDI1LjQwNmM4Ljk0NSw2LjU3LDE5LjI3MywxMi4wODMsMzAuOTc4LDE2LjU2MiBjMTEuNzA0LDQuNDcsMjMuMzE1LDcuNjU5LDM0LjgyOSw5LjU2MmMxMS41MTYsMS45MDMsMjIuODg4LDIuODU0LDM0LjExOSwyLjg1NGM1MS4wMDcsMCw5MC45ODEtMTIuNDY0LDExOS45MDktMzcuMzk3IGMyNi42NDgtMjMuMjIzLDM5Ljk3MS01MC4wNjIsMzkuOTcxLTgwLjUxN2MwLTEwLjg1NS0xLjU3LTIwLjk4NC00LjcxMi0zMC40MDlDMjgyLjUxLDMxNy4zMzcsMjc4LjQyLDMwOS4yNTQsMjczLjM3MiwzMDIuNDk4eiBNMTYzLjMxMSwxOTguNzIyYy05LjcwNywwLTE4LjkzNy0yLjQ3NS0yNy42OTQtNy40MjZjLTguNzU3LTQuOTUtMTYuMTgtMTEuMzc0LTIyLjI3LTE5LjI3MyBjLTYuMDg4LTcuODk4LTExLjQxOC0xNi43OTYtMTUuOTg3LTI2LjY5NWMtNC41NjctOS44OTYtNy45NDQtMTkuNzkyLTEwLjEzNS0yOS42OTJjLTIuMTktOS44OTUtMy4yODQtMTkuMzE4LTMuMjg0LTI4LjI2NSBjMC0xOC4yNzEsNC44NTQtMzMuOTc0LDE0LjU2Mi00Ny4xMDhjOS43MDUtMTMuMTM0LDIzLjQxMS0xOS43MDEsNDEuMTEyLTE5LjcwMWMxMi41NjMsMCwyMy45MzUsMy44OTksMzQuMTE4LDExLjcwNCBjMTAuMTgzLDcuODA0LDE4LjE3NywxNy43MDEsMjMuOTg0LDI5LjY5MmM1LjgwMiwxMS45OTEsMTAuMjc3LDI0LjQwNywxMy40MTcsMzcuMjU3YzMuMTQsMTIuODQ3LDQuNzExLDI0Ljk4Myw0LjcxMSwzNi40MDMgYzAsMTkuMDM2LTQuMTM5LDM0LjMxNy0xMi40MTksNDUuODMzQzE5NS4xNDQsMTkyLjk2NCwxODEuNzc1LDE5OC43MjIsMTYzLjMxMSwxOTguNzIyeiBNMjQyLjI1MSw0MTMuMTIzIGMtNS4yMyw4Ljk0OS0xMi4zMTksMTUuOTQtMjEuMjY3LDIwLjk4MWMtOC45NDYsNS4wNDgtMTguNTA5LDguNzU4LTI4LjY5MywxMS4xNGMtMTAuMTgzLDIuMzg1LTIwLjg4OSwzLjU3Mi0zMi4xMiwzLjU3MiBjLTEyLjE4MiwwLTI0LjI3LTEuNDMxLTM2LjI1OC00LjI4NGMtMTEuOTktMi44NTEtMjMuNDU5LTcuMTg3LTM0LjQwMy0xMi45OTFjLTEwLjk0NC01LjgtMTkuNzk1LTEzLjc5OC0yNi41NTEtMjMuOTgyIGMtNi43NTctMTAuMTg0LTEwLjEzNS0yMS43NDQtMTAuMTM1LTM0LjY5YzAtMTEuNDE5LDIuNTY4LTIxLjYwMSw3LjcwOC0zMC41NWM1LjE0Mi04Ljk0NSwxMS43MDktMTYuMDg0LDE5LjcwMi0yMS40MDggYzcuOTk0LTUuMzMyLDE3LjMxOS05LjcxMywyNy45NzktMTMuMTMxYzEwLjY2LTMuNDMzLDIwLjkzNy01LjgwOCwzMC44MzMtNy4xMzljOS44OTUtMS4zMzUsMTkuOTg1LTEuOTk1LDMwLjI2Mi0xLjk5NSBjNi4yODMsMCwxMS4wNDMsMC4xOTEsMTQuMjc3LDAuNTY3YzEuMTQzLDAuNzY3LDQuMDQzLDIuNzU5LDguNzA4LDUuOTk2czcuODA0LDUuNDI4LDkuNDIzLDYuNTcgYzEuNjE1LDEuMTM3LDQuNTY3LDMuMzI2LDguODUsNi41NjNjNC4yODEsMy4yMzcsNy4zMjcsNS42NjEsOS4xMzUsNy4yNzljMS44MDMsMS42MTgsNC40MjEsNC4wNDUsNy44NDksNy4yNzkgYzMuNDI0LDMuMjM3LDUuOTQ4LDYuMDQzLDcuNTY2LDguNDIyYzEuNjE1LDIuMzc4LDMuNjE2LDUuMjgsNS45OTYsOC43MDJjMi4zOCwzLjQzMyw0LjA0Myw2LjcxNSw0Ljk5OCw5Ljg1NSBjMC45NDgsMy4xNDIsMS44NTQsNi41NjcsMi43MDcsMTAuMjc3YzAuODU1LDMuNzIsMS4yODMsNy41NjksMS4yODMsMTEuNTdDMjUwLjEwNSwzOTMuNzEzLDI0Ny40ODcsNDA0LjE4MiwyNDIuMjUxLDQxMy4xMjN6Ii8+IDxwb2x5Z29uIHBvaW50cz0iNDAxLjk5OCw3My4wODkgNDAxLjk5OCwwIDM2NS40NDksMCAzNjUuNDQ5LDczLjA4OSAyOTIuMzU4LDczLjA4OSAyOTIuMzU4LDEwOS42MzYgMzY1LjQ0OSwxMDkuNjM2ICAzNjUuNDQ5LDE4Mi43MjUgNDAxLjk5OCwxODIuNzI1IDQwMS45OTgsMTA5LjYzNiA0NzUuMDgxLDEwOS42MzYgNDc1LjA4MSw3My4wODkiLz48L3N2Zz4=')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-gp:hover:before { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNlYjQwMjYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTI3My4zNzIsMzAyLjQ5OGMtNS4wNDEtNi43NjItMTAuNjA4LTEzLjA0NS0xNi43LTE4Ljg0MmMtNi4wOTEtNS44MDQtMTIuMTgzLTExLjA4OC0xOC4yNzEtMTUuODQ1IGMtNi4wOTItNC43NTctMTEuNjU5LTkuMzI5LTE2LjcwMi0xMy43MDljLTUuMDQyLTQuMzc0LTkuMTM1LTguOTQ1LTEyLjI3NS0xMy43MDJjLTMuMTQtNC43NTctNC43MTEtOS42MS00LjcxMS0xNC41NTggYzAtNi44NTUsMi4xOS0xMy4yNzgsNi41NjctMTkuMjc0YzQuMzc3LTUuOTk2LDkuNzA3LTExLjc5OSwxNS45ODYtMTcuNDE3YzYuMjgtNS42MTcsMTIuNTU5LTExLjc1MywxOC44NDQtMTguNDE1IGM2LjI3Ni02LjY2NSwxMS42MDQtMTUuNDY1LDE1Ljk4NS0yNi40MTJjNC4zNzMtMTAuOTQ0LDYuNTYzLTIzLjQ1OCw2LjU2My0zNy41NDJjMC0xNi43NS0zLjcxMy0zMi44MzUtMTEuMTM2LTQ4LjI1IGMtNy40MjMtMTUuNDE4LTE3Ljg5LTI3LjQxMi0zMS40MDUtMzUuOTc2aDM4LjU0TDMwMy4yLDBIMTc4LjQ0MWMtMTcuNjk5LDAtMzUuNDk4LDEuOTA2LTUzLjM4NCw1LjcyIGMtMjYuNDUzLDUuOS00OC43MjMsMTkuMzY4LTY2LjgwNiw0MC4zOTdDNDAuMTcxLDY3LjE1LDMxLjEyOSw5MC45OSwzMS4xMjksMTE3LjYzN2MwLDI4LjE3MSwxMC4xMzgsNTEuNTgzLDMwLjQwNiw3MC4yMzMgYzIwLjI2OSwxOC42NDksNDQuNTg1LDI3Ljk3OCw3Mi45NDUsMjcuOTc4YzUuNzEsMCwxMi4zNzEtMC40NzgsMTkuOTg1LTEuNDI3Yy0wLjM4MSwxLjUyMS0xLjA0MywzLjU2Ny0xLjk5Nyw2LjEzNiBzLTEuNzE1LDQuNjItMi4yODYsNi4xNGMtMC41NywxLjUyMS0xLjA0NywzLjM3NS0xLjQyNSw1LjU2NmMtMC4zODIsMi4xOS0wLjU3MSw0LjQyOC0wLjU3MSw2LjcxIGMwLDEyLjU2Myw2LjA4NiwyNi43NDQsMTguMjcxLDQyLjU0MWMtMTQuNDY1LDAuMzg3LTI4LjczNywxLjY3LTQyLjgyNSwzLjg2Yy0xNC4wODQsMi4xOS0yOC44MzMsNS42MTYtNDQuMjUyLDEwLjI4IGMtMTUuNDE3LDQuNjYxLTI5LjIxNywxMS40Mi00MS4zOTYsMjAuMjdjLTEyLjE4Miw4Ljg1NC0yMS4zMTcsMTkuMzY2LTI3LjQwOCwzMS41NDlDMy41MzMsMzYxLjU1OSwwLjAxLDM3NC40MDUsMC4wMSwzODYuMDE3IGMwLDEyLjc1MSwyLjg1NywyNC4zMTQsOC41NjUsMzQuNjljNS43MDgsMTAuMzY5LDEzLjAzNSwxOC44NDIsMjEuOTgyLDI1LjQwNmM4Ljk0NSw2LjU3LDE5LjI3MywxMi4wODMsMzAuOTc4LDE2LjU2MiBjMTEuNzA0LDQuNDcsMjMuMzE1LDcuNjU5LDM0LjgyOSw5LjU2MmMxMS41MTYsMS45MDMsMjIuODg4LDIuODU0LDM0LjExOSwyLjg1NGM1MS4wMDcsMCw5MC45ODEtMTIuNDY0LDExOS45MDktMzcuMzk3IGMyNi42NDgtMjMuMjIzLDM5Ljk3MS01MC4wNjIsMzkuOTcxLTgwLjUxN2MwLTEwLjg1NS0xLjU3LTIwLjk4NC00LjcxMi0zMC40MDlDMjgyLjUxLDMxNy4zMzcsMjc4LjQyLDMwOS4yNTQsMjczLjM3MiwzMDIuNDk4eiBNMTYzLjMxMSwxOTguNzIyYy05LjcwNywwLTE4LjkzNy0yLjQ3NS0yNy42OTQtNy40MjZjLTguNzU3LTQuOTUtMTYuMTgtMTEuMzc0LTIyLjI3LTE5LjI3MyBjLTYuMDg4LTcuODk4LTExLjQxOC0xNi43OTYtMTUuOTg3LTI2LjY5NWMtNC41NjctOS44OTYtNy45NDQtMTkuNzkyLTEwLjEzNS0yOS42OTJjLTIuMTktOS44OTUtMy4yODQtMTkuMzE4LTMuMjg0LTI4LjI2NSBjMC0xOC4yNzEsNC44NTQtMzMuOTc0LDE0LjU2Mi00Ny4xMDhjOS43MDUtMTMuMTM0LDIzLjQxMS0xOS43MDEsNDEuMTEyLTE5LjcwMWMxMi41NjMsMCwyMy45MzUsMy44OTksMzQuMTE4LDExLjcwNCBjMTAuMTgzLDcuODA0LDE4LjE3NywxNy43MDEsMjMuOTg0LDI5LjY5MmM1LjgwMiwxMS45OTEsMTAuMjc3LDI0LjQwNywxMy40MTcsMzcuMjU3YzMuMTQsMTIuODQ3LDQuNzExLDI0Ljk4Myw0LjcxMSwzNi40MDMgYzAsMTkuMDM2LTQuMTM5LDM0LjMxNy0xMi40MTksNDUuODMzQzE5NS4xNDQsMTkyLjk2NCwxODEuNzc1LDE5OC43MjIsMTYzLjMxMSwxOTguNzIyeiBNMjQyLjI1MSw0MTMuMTIzIGMtNS4yMyw4Ljk0OS0xMi4zMTksMTUuOTQtMjEuMjY3LDIwLjk4MWMtOC45NDYsNS4wNDgtMTguNTA5LDguNzU4LTI4LjY5MywxMS4xNGMtMTAuMTgzLDIuMzg1LTIwLjg4OSwzLjU3Mi0zMi4xMiwzLjU3MiBjLTEyLjE4MiwwLTI0LjI3LTEuNDMxLTM2LjI1OC00LjI4NGMtMTEuOTktMi44NTEtMjMuNDU5LTcuMTg3LTM0LjQwMy0xMi45OTFjLTEwLjk0NC01LjgtMTkuNzk1LTEzLjc5OC0yNi41NTEtMjMuOTgyIGMtNi43NTctMTAuMTg0LTEwLjEzNS0yMS43NDQtMTAuMTM1LTM0LjY5YzAtMTEuNDE5LDIuNTY4LTIxLjYwMSw3LjcwOC0zMC41NWM1LjE0Mi04Ljk0NSwxMS43MDktMTYuMDg0LDE5LjcwMi0yMS40MDggYzcuOTk0LTUuMzMyLDE3LjMxOS05LjcxMywyNy45NzktMTMuMTMxYzEwLjY2LTMuNDMzLDIwLjkzNy01LjgwOCwzMC44MzMtNy4xMzljOS44OTUtMS4zMzUsMTkuOTg1LTEuOTk1LDMwLjI2Mi0xLjk5NSBjNi4yODMsMCwxMS4wNDMsMC4xOTEsMTQuMjc3LDAuNTY3YzEuMTQzLDAuNzY3LDQuMDQzLDIuNzU5LDguNzA4LDUuOTk2czcuODA0LDUuNDI4LDkuNDIzLDYuNTcgYzEuNjE1LDEuMTM3LDQuNTY3LDMuMzI2LDguODUsNi41NjNjNC4yODEsMy4yMzcsNy4zMjcsNS42NjEsOS4xMzUsNy4yNzljMS44MDMsMS42MTgsNC40MjEsNC4wNDUsNy44NDksNy4yNzkgYzMuNDI0LDMuMjM3LDUuOTQ4LDYuMDQzLDcuNTY2LDguNDIyYzEuNjE1LDIuMzc4LDMuNjE2LDUuMjgsNS45OTYsOC43MDJjMi4zOCwzLjQzMyw0LjA0Myw2LjcxNSw0Ljk5OCw5Ljg1NSBjMC45NDgsMy4xNDIsMS44NTQsNi41NjcsMi43MDcsMTAuMjc3YzAuODU1LDMuNzIsMS4yODMsNy41NjksMS4yODMsMTEuNTdDMjUwLjEwNSwzOTMuNzEzLDI0Ny40ODcsNDA0LjE4MiwyNDIuMjUxLDQxMy4xMjN6Ii8+IDxwb2x5Z29uIHBvaW50cz0iNDAxLjk5OCw3My4wODkgNDAxLjk5OCwwIDM2NS40NDksMCAzNjUuNDQ5LDczLjA4OSAyOTIuMzU4LDczLjA4OSAyOTIuMzU4LDEwOS42MzYgMzY1LjQ0OSwxMDkuNjM2ICAzNjUuNDQ5LDE4Mi43MjUgNDAxLjk5OCwxODIuNzI1IDQwMS45OTgsMTA5LjYzNiA0NzUuMDgxLDEwOS42MzYgNDc1LjA4MSw3My4wODkiLz48L3N2Zz4=')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-ms { display:none;} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-ms::before { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTcgMTciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDE3IDE3IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNOC4wMjEsMS4zODV2Ni40MzdoOC43OTFWMC4xMjdMOC4wMjEsMS4zODV6IE0wLDcuODIyaDYuNjQ4VjEuNDk0TDAsMi40NDNWNy44MjJ6IE0wLDE0LjE3NSBsNi42NDgsMS4wMzFWOC42M0gwVjE0LjE3NXogTTguMDIxLDE1LjMyMWw4Ljc5MSwxLjM2NFY4LjYzSDguMDIxVjE1LjMyMXoiLz48L3N2Zz4=')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-ms:hover:before { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwMEJDRjIiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTcgMTciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDE3IDE3IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNOC4wMjEsMS4zODV2Ni40MzdoOC43OTFWMC4xMjdMOC4wMjEsMS4zODV6IE0wLDcuODIyaDYuNjQ4VjEuNDk0TDAsMi40NDNWNy44MjJ6IE0wLDE0LjE3NSBsNi42NDgsMS4wMzFWOC42M0gwVjE0LjE3NXogTTguMDIxLDE1LjMyMWw4Ljc5MSwxLjM2NFY4LjYzSDguMDIxVjE1LjMyMXoiLz48L3N2Zz4=')} #wpmchimpa-main .wpmchimpa-close-button{ position: absolute; display: block; top: 0; right: 0; width: 25px; text-align: center; cursor: pointer; } #wpmchimpa-main .wpmchimpa-close-button::before{ content: "\00D7"; font-size: 25px; line-height: 25px; font-weight: 100; color: #999; opacity: 0.4; color:;} #wpmchimpa-main .wpmchimpa-close-button:hover:before{ opacity: 1; } #wpmchimpa-main .wpmchimpa-feedback.wpmchimpa-done{ font-size: 15px; margin: 10px; height: auto;} #wpmchimpa-main .wpmchimpa-feedback.wpmchimpa-done:before{ content:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSIxNDIuOCwzMjMuODUgMzUuNywyMTYuNzUgMCwyNTIuNDUgMTQyLjgsMzk1LjI1IDQ0OC44LDg5LjI1IDQxMy4xLDUzLjU1Ii8+PC9zdmc+'); width: 40px; height: 40px; border-radius: 20px; line-height: 46px; display: block; background-color: #01E169; margin: 40px auto; } .wpmc_2col #wpmchimpa .wpmc_colsplit{ width: calc(50% - 5px); display: inline-block; float: left; } .wpmc_2col #wpmchimpa .wpmc_coleven{ margin-left: 10px; } @media only screen and (max-width: 600px){ .wpmc_2col #wpmchimpa .wpmc_colsplit{ width: 100%; margin-left: 0; } } .animated { -webkit-animation-duration: 1s; animation-duration: 1s; -webkit-animation-fill-mode: both; animation-fill-mode: both; } @-webkit-keyframes bounceInDown { 0%, 60%, 75%, 90%, 100% { -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); } 0% { opacity: 0; -webkit-transform: translate3d(0, -3000px, 0); transform: translate3d(0, -3000px, 0); } 60% { opacity: 1; -webkit-transform: translate3d(0, 25px, 0); transform: translate3d(0, 25px, 0); } 75% { -webkit-transform: translate3d(0, -10px, 0); transform: translate3d(0, -10px, 0); } 90% { -webkit-transform: translate3d(0, 5px, 0); transform: translate3d(0, 5px, 0); } 100% { -webkit-transform: none; transform: none; } } @keyframes bounceInDown { 0%, 60%, 75%, 90%, 100% { -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); } 0% { opacity: 0; -webkit-transform: translate3d(0, -3000px, 0); transform: translate3d(0, -3000px, 0); } 60% { opacity: 1; -webkit-transform: translate3d(0, 25px, 0); transform: translate3d(0, 25px, 0); } 75% { -webkit-transform: translate3d(0, -10px, 0); transform: translate3d(0, -10px, 0); } 90% { -webkit-transform: translate3d(0, 5px, 0); transform: translate3d(0, 5px, 0); } 100% { -webkit-transform: none; transform: none; } } .bounceInDown { -webkit-animation-name: bounceInDown; animation-name: bounceInDown; } .animatedout { -webkit-animation-duration: 1s; animation-duration: 1s; -webkit-animation-fill-mode: both; animation-fill-mode: both; } @-webkit-keyframes rollOut { 0% { opacity: 1; } 100% { opacity: 0; -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); } } @keyframes rollOut { 0% { opacity: 1; } 100% { opacity: 0; -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); } } .rollOut { -webkit-animation-name: rollOut; animation-name: rollOut; } @-webkit-keyframes zoomIn { 0% { opacity: 0; -webkit-transform: scale3d(.3, .3, .3); transform: scale3d(.3, .3, .3); } 50% { opacity: 1; } } </style> <div class="wpmchimpa-reset wpmchimpa-overlay-bg wpmchimpselector chimpmatecss"> <div class="wpmchimpa-maina bounceInDown animated" wpmcexitanim> <div class="wpmchimpa-mainc"> <div id="wpmchimpa-main"> <div id="wpmchimpa-newsletterform" class="wpmchimpa-wrapper"> <div class="wpmchimpa" id="wpmchimpa"> <h3>زنگ</h3> <div class="wpmchimpa_para"><div style="text-align: center;">کسانی هستند که این خبر را قبل از شما می خوانند.</div><div style="text-align: center;">برای دریافت آخرین مقالات مشترک شوید. <img src="http://" loading=lazy></div></div> <form wpmc_suc wpmc_msg="Спасибо! ПРОВЕРЬТЕ ПОЧТУ" action="" method="post"> <input type="hidden" name="action" value="wpmchimpa_add_email_ajax"/> <input type="hidden" name="wpmcform" value="1"/> <div class="formbox wpmchimpa-field"><div class="wpmchimpa-text wpmc-ficon"><input type="text" name="email" wpmctype="email" wpmcfield="email" wpmcreq="true" required/><span class="inputlabel">پست الکترونیک</span><span class="inputicon"></span><div class="wpmcinfierr" wpmcerr="email"></div></div><div class="wpmchimpa-subsc"><div class="wpmchimpa-subs-button"></div><div class="wpmchimpa-signal"><style type="text/css">#wpmchimpa-main .sp8 { margin: 0 auto;width: 50px;height: 30px;} #wpmchimpa-main .sp8 > div { background-color: #3d3d3d;margin-left: 3px;height: 100%;width: 6px;display: inline-block;-webkit-animation: wpmchimpa-mainsp8 1.2s infinite ease-in-out;animation: wpmchimpa-mainsp8 1.2s infinite ease-in-out;} #wpmchimpa-main .sp8 .sp82 { -webkit-animation-delay: -1.1s;animation-delay: -1.1s;} #wpmchimpa-main .sp8 .sp83 { -webkit-animation-delay: -1.0s;animation-delay: -1.0s;} #wpmchimpa-main .sp8 .sp84 { -webkit-animation-delay: -0.9s;animation-delay: -0.9s;} #wpmchimpa-main .sp8 .sp85 { -webkit-animation-delay: -0.8s;animation-delay: -0.8s;} @-webkit-keyframes wpmchimpa-mainsp8 { 0%, 40%, 100% { -webkit-transform: scaleY(0.4) } 20% { -webkit-transform: scaleY(1.0) } }@keyframes wpmchimpa-mainsp8 { 0%, 40%, 100% { transform: scaleY(0.4);-webkit-transform: scaleY(0.4);} 20% { transform: scaleY(1.0);-webkit-transform: scaleY(1.0);} }</style><div class="sp8"><div class="sp81"></div><div class="sp82"></div><div class="sp83"></div><div class="sp84"></div><div class="sp85"></div></div></div></div><div style="clear:both"></div></div><div class="wpmchimpa-field wpmchimpa-text wpmc_colsplit wpmc-ficon"><input type="text" name="merge_fields[FNAME]" wpmctype="text" wpmcfield="FNAME" wpmcreq="true" required/><span class="inputlabel">نام</span><span class="inputicon"></span><div class="wpmcinfierr" wpmcerr="FNAME"></div></div><div class="wpmchimpa-field wpmchimpa-text wpmc_colsplit wpmc-ficon"><input type="text" name="merge_fields[LNAME]" wpmctype="text" wpmcfield="LNAME" wpmcreq="true" required/><span class="inputlabel">نام خانوادگی</span><span class="inputicon"></span><div class="wpmcinfierr" wpmcerr="LNAME"></div></div><div class="wpmchimpa-field wpmchimpa-radio"><div class="wpmchimpa-itemh">چگونه می خواهید The Bell را بخوانید</div><div class="wpmchimpa-itemb"><label class="wpmchimpa-item"><input type="radio" name="group[f899931c09]" value="a22e2103b4" wpmctype="radio" wpmcfield="f899931c09" wpmcreq="true"><span>دوبار در روز</span></label><label class="wpmchimpa-item"><input type="radio" name="group[f899931c09]" value="4ab55de31a" wpmctype="radio" wpmcfield="f899931c09" wpmcreq="true"><span>ارسال نامه صبحگاهی</span></label><label class="wpmchimpa-item"><input type="radio" name="group[f899931c09]" value="e386c1935e" wpmctype="radio" wpmcfield="f899931c09" wpmcreq="true"><span>ارسال نامه عصرانه</span></label></div><div class="wpmcinfierr" wpmcerr="f899931c09"></div></div> <div style="clear:both"></div> <div class="wpmchimpa-tag">بدون اسپم</div> </form> <div class="wpmchimpa-feedback" wpmcerr="gen"></div> </div> </div> <div class="wpmchimpa-close-button"></div> </div> </div> </div> </div><script data-cfasync="false" src="/cdn-cgi/scripts/af2821b0/cloudflare-static/email-decode.min.js"></script><script type='text/javascript' src='https://qipu.ru/wp-content/themes/authentic/js/vendors.min.js?ver=201710093'></script> <script type='text/javascript'> /* <![CDATA[ */ var translation = { "next":"Next","previous":"Previous"} ; /* ]]> */ </script> <script type='text/javascript' src='https://qipu.ru/wp-content/themes/authentic/js/scripts.js?ver=201710093'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=9.9.9'></script> <script type='text/javascript' src='https://qipu.ru/wp-content/plugins/chimpmatepro/public/assets/js/public.js?ver=1.3.2'></script> </body> </html>