xml.parsers.expat --- تجزیه سریع XML با استفاده از Expat¶
توجه
اگر نیاز دارید دادههای غیرقابلاعتماد یا احراز هویتنشده را تجزیه کنید، امنیت XML را ببینید.
ماژول xml.parsers.expat یک رابط پایتون برای پارسر XML بدون اعتبارسنجی Expat است. این ماژول یک نوع توسعهای واحد، xmlparser، ارائه میکند که وضعیت فعلی یک پارسر XML را نشان میدهد. پس از ایجاد یک شیء xmlparser، میتوان ویژگیهای مختلف آن شیء را به توابع هندلر اختصاص داد. سپس هنگامی که یک سند XML به پارسر داده میشود، توابع هندلر برای دادههای نویسهای و نمادگذاریهای درون سند XML فراخوانی میشوند.
این ماژول از ماژول pyexpat برای فراهم کردن دسترسی به پارسرٔ Expat استفاده میکند. استفادهی مستقیم از ماژول pyexpat منسوخ شده است.
این ماژول استثنا، شیء نوع و آیتمهای دادهی زیر را فراهم میکند:
- exception xml.parsers.expat.ExpatError¶
استثنایی که وقتی Expat خطایی را گزارش میدهد، پرتاب میشود. برای اطلاعات بیشتر در مورد تفسیر خطاهای Expat، بخش استثناهای ExpatError را ببینید.
- exception xml.parsers.expat.error¶
نام مستعار برای
ExpatError.
- xml.parsers.expat.XMLParserType¶
نوع مقادیر بازگشتی تابع
ParserCreate().
- xml.parsers.expat.EXPAT_VERSION¶
رشتهی نسخهی کتابخانهی Expat که توسط مفسر بارگذاری شده است، مانند
'expat_2.8.4'.
- xml.parsers.expat.version_info¶
نسخهی کتابخانهی Expat که توسط مفسر بارگذاری شده است، به صورت یک تاپل از سه عدد صحیح: نسخهی اصلی، فرعی و ریز.
- xml.parsers.expat.features¶
فهرست ویژگیهایی که کتابخانهی Expat بارگذاریشده با آنها کامپایلشده است، به صورت جفتهای
(name, value). مقدار تنها برای ویژگیهایی که دارای مقدار هستند معنا دارد، مانند'XML_CONTEXT_BYTES'یا محدودیتهای پیشفرض حفاظت'XML_BLAP_ACT_THRES'و'XML_AT_MAX_AMP'؛ برای سایر ویژگیها، مانند'XML_DTD'و'XML_NS'، مقدار0است و تنها حضور نام مهم است.
ماژول xml.parsers.expat شامل دو تابع است:
- xml.parsers.expat.ErrorString(errno)¶
یک رشته توضیحی برای شماره خطای دادهشده errno برمیگرداند.
- xml.parsers.expat.ParserCreate(encoding=None, namespace_separator=None, intern=None)¶
Creates and returns a new
xmlparserobject. encoding [1], if specified, must be a string naming the encoding used by the XML data. If it is given it will override the implicit or explicit encoding of the document.جزئیات پیادهسازی در CPython: Expat natively understands and processes UTF-8, UTF-16, UTF-16BE, UTF-16LE, ISO-8859-1, and US-ASCII. For other encodings (including aliases like Latin1 and ASCII) it falls back to Python. It supports most of 8-bit encodings and many multi-byte encodings like Shift_JIS, although only BMP characters (
U+0000-U+FFFF) are supported with non-native encodings (this restriction is also applied to aliases like UTF8). These restrictions only apply if encoding is not given.تغییر یافته در نسخهی 3.16.0a0 (unreleased): Added support for multi-byte encodings.
پارسرهای ایجادشده از طریق
ParserCreate()، پارسرهای «ریشه» نامیده میشوند، از این جهت که هیچ پارسر والدی به آنها متصل نیست. پارسرهای غیرریشهای بهوسیلهیparser.ExternalEntityParserCreateایجاد میشوند.Expat میتواند بهصورت اختیاری پردازش فضای نام XML را برای شما انجام دهد؛ این قابلیت با ارائه یک مقدار برای namespace_separator فعال میشود. این مقدار باید رشتهای با یک نویسه باشد؛ اگر رشته طول غیرمجازی داشته باشد، یک
ValueErrorپرتاب خواهد شد (Noneمعادل حذف در نظر گرفته میشود). هنگامی که پردازش فضای نام فعال باشد، نام نوع المانها و نام صفتهایی که به یک فضای نام تعلق دارند، بسط داده خواهند شد. نام المانی که به هندلرهای المانStartElementHandlerوEndElementHandlerارسال میشود، برابر با الحاق URI فضای نام، نویسهی جداکنندهی فضای نام و بخش محلی نام خواهد بود. اگر جداکنندهی فضای نام یک بایت صفر (chr(0)) باشد، URI فضای نام و بخش محلی بدون هیچ جداکنندهای به هم الحاق خواهند شد.برای مثال، اگر namespace_separator برابر با یک نویسهی فاصله (
' ') تنظیم شده باشد و سند زیر تجزیه شود:<?xml version="1.0"?> <root xmlns = "http://default-namespace.org/" xmlns:py = "http://www.python.org/ns/"> <py:elem1 /> <elem2 xmlns="" /> </root>
StartElementHandlerرشتههای زیر را برای هر عنصر دریافت خواهد کرد:http://default-namespace.org/ root http://www.python.org/ns/ elem1 elem2
intern، در صورت داده شدن، باید یک دیکشنری باشد. این برای درونیسازی کردن نامهای المانها و ویژگیها استفاده میشود، و به عنوان ویژگی
internدر دسترس است. به طور پیشفرض یک دیکشنری جدید خالی برای هر پارسر ایجاد میشود.به دلیل محدودیتهایی در کتابخانه
Expatکهpyexpatاز آن استفاده میکند، نمونهیxmlparserبرگرداندهشده فقط میتواند برای تجزیهی یک سند XML استفاده شود. برای فراهم کردن نمونههای پارسر یکتا،ParserCreateرا برای هر سند فراخوانی کنید.
همچنین ملاحظه نمائید
- پارسرٔ Expat XML
صفحهی اصلی پروژه Expat.
اشیاء XMLParser¶
اشیای xmlparser متدهای زیر را دارند:
- xmlparser.Parse(data[, isfinal])¶
محتویات data را تجزیه میکند، با فراخوانی توابع هندلر مناسب برای پردازش دادههای تجزیهشده. data میتواند یک شیء شبهبایت یا یک رشته باشد. اگر رشته باشد، اعلام کدگذاری در دادههای XML نادیده گرفته میشود، و دادهها به عنوان متنِ کدگشاییشدهی قبلی تجزیه میشوند. isfinal باید در فراخوانی نهایی این متد true باشد؛ این امکان تجزیه یک پرونده تکی به صورت قطعات را میدهد، نه ارائه چندین پرونده. data میتواند در هر زمان خالی باشد.
- xmlparser.ParseFile(file)¶
دادههای XML را از شیء file خوانده و تجزیه کنید. file تنها نیاز است که متد
read(nbytes)را فراهم کند، که بایتها را برمیگرداند، و یک شیء بایت خالی وقتی دادهای بیشتر وجود نداشته باشد. پروندههای متنی پشتیبانی نمیشوند؛ برای دادههایی که قبلاً کدگشایی شدهاند ازParse()استفاده کنید.
- xmlparser.SetBase(base)¶
پایهای را تنظیم میکند که برای حل URIهای نسبی در شناسههای سیستم در اعلانها استفاده میشود. حل شناسههای نسبی بر عهده برنامه گذاشته شده است: این مقدار بهعنوان آرگومان base به توابع
ExternalEntityRefHandler()،NotationDeclHandler()وUnparsedEntityDeclHandler()ارسال میشود.
- xmlparser.GetBase()¶
رشتهای شامل پایهی تنظیمشده توسط فراخوانی پیشین
SetBase()، یا در صورتی کهSetBase()فراخوانی نشده باشد،Noneبرمیگرداند.
- xmlparser.GetSpecifiedAttributeCount()¶
Return the index just past the attributes given in the start tag. Attributes defaulted from the DTD follow the specified ones, so attributes at lower indices in the list passed to
StartElementHandlerwere given in the start tag. Each attribute takes two items in that list, its name and its value. Only meaningful inside aStartElementHandlercall, and only ifordered_attributesis true.اضافه شده در نسخهی 3.16.0a0 (unreleased).
- xmlparser.GetInputContext()¶
دادههای ورودی که رویداد جاری را تولید کردهاند را به عنوان یک شیء
bytesبرمیگرداند. دادهها در کدگذاری موجودیتی که متن را در بر میگیرد هستند. این دادهها تا پایان ورودی بافرشدهی جاری گسترش مییابد، بنابراین میتواند دادههای رویدادهای بعدی را نیز در بر بگیرد، و اگر رویداد توسط مقدار زیادی متن تولید شده باشد، ممکن است همهی آن در دسترس نباشد. وقتی در حالی که هیچ هندلر رویدادی فعال نیست فراخوانی شود، مقدار بازگشتیNoneاست.
- xmlparser.ExternalEntityParserCreate(context[, encoding])¶
یک پارسر «فرزند» ایجاد کنید که میتوان از آن برای تجزیهی یک موجودیت تجزیهشدهی خارجی که محتوای تجزیهشده توسط پارسر والد به آن ارجاع میدهد، استفاده کرد. پارامتر context باید رشتهای باشد که به تابع هندلر
ExternalEntityRefHandler()، که در ادامه توضیح داده شده است، ارسال میشود. پارسر فرزند باordered_attributesوspecified_attributesکه به مقادیر این پارسر تنظیم شدهاند، ایجاد میشود.
- xmlparser.SetParamEntityParsing(flag)¶
تجزیهی موجودیتهای پارامتری (از جمله زیرمجموعهی خارجی DTD) را کنترل میکند. مقادیر ممکن برای flag عبارتند از
XML_PARAM_ENTITY_PARSING_NEVER،XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONEوXML_PARAM_ENTITY_PARSING_ALWAYS. در صورتی که تنظیم پرچم موفقیتآمیز بود، true را برمیگرداند.
- xmlparser.UseForeignDTD([flag])¶
فراخوانی این متد با یک مقدار درست برای flag (پیشفرض) باعث میشود Expat
ExternalEntityRefHandlerرا باNoneبرای تمام آرگومانها فراخوانی کند تا امکان بارگذاری یک DTD جایگزین فراهم شود. اگر سند حاوی اعلان نوع سند نباشد،ExternalEntityRefHandlerهمچنان فراخوانی خواهد شد، اماStartDoctypeDeclHandlerوEndDoctypeDeclHandlerفراخوانی نخواهند شد.ارسال یک مقدار نادرست برای flag، فراخوانی پیشین را که مقدار درست ارسال کرده است لغو میکند، اما در غیر این صورت تأثیری ندارد.
این متد تنها میتواند پیش از فراخوانی متدهای
Parse()یاParseFile()فراخوانی شود؛ فراخوانی آن پس از فراخوانی هر یک از آنها باعث پرتابExpatErrorبا ویژگیcodeتنظیمشده بهerrors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]میشود.
- xmlparser.SetReparseDeferralEnabled(enabled)¶
هشدار
فراخوانی
SetReparseDeferralEnabled(False)پیامدهای امنیتی دارد، همانطور که در ادامه شرح داده شده است؛ لطفاً پیش از استفاده از متدSetReparseDeferralEnabledمطمئن شوید که این پیامدها را درک میکنید.Expat 2.6.0 یک سازوکار امنیتی به نام «تعویق تجزیهی مجدد» (reparse deferral) معرفی کرد که در آن به جای ایجاد منع سرویس از طریق رانتایم درجهی دوم ناشی از تجزیهی مجدد توکنهای بزرگ، تجزیهی مجدد توکنهای ناتمام اکنون بهطور پیشفرض تا دریافت مقدار کافی ورودی به تعویق میافتد. به دلیل این تأخیر، ممکن است هندلرهای ثبتشده — بسته به اندازهی تکههای ورودی ارسالشده به Expat — دیگر بلافاصله پس از ارسال ورودی جدید به پارسر فراخوانی نشوند. در مواردی که بازخورد فوری و بر عهده گرفتن مسئولیت محافظت در برابر منع سرویس ناشی از توکنهای بزرگ هر دو مطلوب باشند، فراخوانی
SetReparseDeferralEnabled(False)تعویق تجزیهی مجدد را برای نمونهی جاری پارسر Expat، بهطور موقت یا بهطور کامل غیرفعال میکند. فراخوانیSetReparseDeferralEnabled(True)امکان فعالسازی مجدد تعویق تجزیهی مجدد را فراهم میکند.SetReparseDeferralEnabled()has been backported to some prior releases of CPython as a security fix. Check for availability usinghasattr()if used in code running across a variety of Python versions.اضافه شده در نسخهی 3.13.
- xmlparser.GetReparseDeferralEnabled()¶
برمیگرداند که آیا تعویق تجزیه مجدد (reparse deferral) در حال حاضر برای نمونه پارسر Expat دادهشده فعال است یا خیر.
اضافه شده در نسخهی 3.13.
اشیای xmlparser دارای متدهای زیر برای تنظیم حفاظتها در برابر برخی آسیبپذیریهای رایج XML هستند.
- xmlparser.SetBillionLaughsAttackProtectionActivationThreshold(threshold, /)¶
تعداد بایتهای خروجی مورد نیاز برای فعالسازی محافظت در برابر حملات billion laughs را تنظیم میکند.
تعداد بایتهای خروجی، افزایش حجم ناشی از بسط موجودیت (entity expansion) و خواندن پروندههای DTD را شامل میشود.
اشیای پارسر معمولاً دارای آستانه فعالسازی حفاظت ۸ MiB هستند، اما مقدار پیشفرض واقعی به کتابخانه زیربنایی Expat بستگی دارد.
اگر این متد را روی یک پارسر non-root فراخوانی کنید، یک
ExpatErrorپرتاب میشود. نباید ازlinenoوoffsetمربوطه استفاده کنید، زیرا ممکن است معنای خاصی نداشته باشند.SetBillionLaughsAttackProtectionActivationThreshold()has been backported to some prior releases of CPython as a security fix. Check for availability usinghasattr()if used in code running across a variety of Python versions.توجه
آستانههای فعالسازی کمتر از ۴ MiB، پشتیبانی از بار DITA 1.3 را مختل میکنند و بنابراین توصیه نمیشوند.
اضافه شده در نسخهی 3.15.
- xmlparser.SetBillionLaughsAttackProtectionMaximumAmplification(max_factor, /)¶
حداکثر ضریب تقویت قابلتحمل را برای محافظت در برابر حملات billion laughs تنظیم میکند.
ضریب تقویت هنگام تجزیه بهصورت
(direct + indirect) / directمحاسبه میشود، که در آنdirectتعداد بایتهای خواندهشده از سند اصلی در حین تجزیه وindirectتعداد بایتهای اضافهشده در اثر بسط موجودیتها و خواندن پروندههای DTD خارجی است.مقدار max_factor باید یک مقدار
floatغیر NaN و بزرگتر یا مساوی ۱.۰ باشد. در عمل، با پروندههای کوچک بیخطر، تقویتهای اوج با ضریب ۱۵۰۰۰ برای کل بار و با ضریب ۳۰۰۰۰ در میانهی تجزیه مشاهده شدهاند. بهویژه، آستانه فعالسازی باید با دقت انتخاب شود تا از موارد مثبت کاذب جلوگیری شود.اشیای پارسر معمولاً دارای حداکثر ضریب تقویت ۱۰۰ هستند، اما مقدار پیشفرض واقعی به کتابخانه زیرین Expat بستگی دارد.
اگر این متد بر روی یک پارسر non-root فراخوانی شود یا max_factor خارج از محدوده معتبر باشد، یک استثنای
ExpatErrorپرتاب میشود. نباید ازlinenoوoffsetمتناظر استفاده شود، زیرا ممکن است معنای خاصی نداشته باشند.SetBillionLaughsAttackProtectionMaximumAmplification()has been backported to some prior releases of CPython as a security fix. Check for availability usinghasattr()if used in code running across a variety of Python versions.توجه
حداکثر ضریب تقویت تنها در صورتی در نظر گرفته میشود که از آستانهای که میتوان آن را با
SetBillionLaughsAttackProtectionActivationThreshold()تنظیم کرد، عبور شود.اضافه شده در نسخهی 3.15.
- xmlparser.SetAllocTrackerActivationThreshold(threshold, /)¶
تعداد بایتهای تخصیصیافته از حافظه پویا را که برای فعالسازی حفاظت در برابر استفاده نامتناسب از RAM لازم است، تنظیم میکند.
اشیای پارسر معمولاً آستانه فعالسازی تخصیص ۶۴ MiB دارند، اما مقدار پیشفرض واقعی به کتابخانه Expat زیرین بستگی دارد.
اگر این متد را روی یک پارسر non-root فراخوانی کنید، یک
ExpatErrorپرتاب میشود. نباید ازlinenoوoffsetمربوطه استفاده کنید، زیرا ممکن است معنای خاصی نداشته باشند.SetAllocTrackerActivationThreshold()has been backported to some prior releases of CPython as a security fix. Check for availability usinghasattr()if used in code running across a variety of Python versions.اضافه شده در نسخهی 3.15.
- xmlparser.SetAllocTrackerMaximumAmplification(max_factor, /)¶
حداکثر ضریب تقویت بین ورودی مستقیم و بایتهای حافظه پویای تخصیصیافته را تنظیم میکند.
ضریب تقویت در حین تجزیه بهصورت
allocated / directمحاسبه میشود، که در آنdirectتعداد بایتهای خواندهشده از سند اصلی در حین تجزیه وallocatedتعداد بایتهای حافظه پویای تخصیصدادهشده در سلسلهمراتب پارسر است.مقدار max_factor باید مقداری از نوع
float، غیر NaN و بزرگتر یا مساوی 1.0 باشد. در عمل، حتی با پروندههای بیخطر نیز میتوان ضرایب تقویت بزرگتر از 100.0 را در نزدیکی شروع تجزیه مشاهده کرد. بهویژه، آستانه فعالسازی باید با دقت انتخاب شود تا از مثبتهای کاذب اجتناب شود.اشیای پارسر معمولاً دارای حداکثر ضریب تقویت ۱۰۰ هستند، اما مقدار پیشفرض واقعی به کتابخانه زیرین Expat بستگی دارد.
اگر این متد بر روی یک پارسر non-root فراخوانی شود یا max_factor خارج از محدوده معتبر باشد، یک استثنای
ExpatErrorپرتاب میشود. نباید ازlinenoوoffsetمتناظر استفاده شود، زیرا ممکن است معنای خاصی نداشته باشند.SetAllocTrackerMaximumAmplification()has been backported to some prior releases of CPython as a security fix. Check for availability usinghasattr()if used in code running across a variety of Python versions.توجه
حداکثر ضریب تقویت تنها در صورتی در نظر گرفته میشود که از آستانهای که با
SetAllocTrackerActivationThreshold()قابل تنظیم است، فراتر رود.اضافه شده در نسخهی 3.15.
اشیای xmlparser ویژگیهای زیر را دارند:
- xmlparser.buffer_size¶
اندازهی بافری که هنگامی که
buffer_textبرابر true باشد استفاده میشود. میتوان اندازهی جدید بافر را با انتساب یک مقدار عدد صحیح جدید به این ویژگی تنظیم کرد. هنگامی که اندازه تغییر کند، بافر تخلیه خواهد شد.
- xmlparser.buffer_text¶
تنظیم این ویژگی روی مقدار درست باعث میشود شیء
xmlparserمحتوای متنی بازگرداندهشده توسط Expat را در بافرذخیره کند تا تا حد امکان از فراخوانیهای مکرر کالبکCharacterDataHandler()اجتناب شود. این کار میتواند عملکرد را بهطور قابلتوجهی بهبود بخشد، زیرا Expat معمولاً دادههای نویسهای را در هر پایان خط به تکهها میشکند. این ویژگی بهطور پیشفرض نادرست است و میتواند در هر زمانی تغییر کند. توجه داشته باشید که وقتی این ویژگی نادرست است، دادههایی که حاوی خط جدید نیستند نیز ممکن است بخشبندی (chunking) شوند.
- xmlparser.buffer_used¶
اگر
buffer_textفعال باشد، تعداد بایتهای ذخیرهشده در بافر است. این بایتها بیانگر متن کدگذاریشده با UTF-8 هستند. این ویژگی وقتیbuffer_textنادرست باشد، تفسیر معناداری ندارد.
- xmlparser.ordered_attributes¶
تنظیم این ویژگی روی یک عدد صحیح غیرصفر باعث میشود صفتها بهجای یک دیکشنری، بهصورت یک فهرست گزارش شوند. صفتها به ترتیب موجود در متن سند ارائه میشوند. برای هر صفت، دو آیتم از فهرست ارائه میشوند: نام صفت و مقدار صفت. (نسخههای قدیمیتر این ماژول نیز از همین قالب استفاده میکردند.) بهطور پیشفرض، این ویژگی نادرست است؛ میتوان آن را در هر زمانی تغییر داد.
- xmlparser.specified_attributes¶
اگر روی یک عدد صحیح غیرصفر تنظیم شود، پارسر فقط آن ویژگیهایی را گزارش میکند که در نمونه سند مشخص شدهاند و نه آنهایی که از اعلامیههای ویژگی به دست آمدهاند. برنامههایی که این ویژگی را تنظیم میکنند باید بهویژه مراقب باشند که از اطلاعات تکمیلی موجود در اعلامیهها، در صورت نیاز، برای رعایت استانداردهای رفتار پردازندههای XML استفاده کنند. بهطور پیشفرض، این ویژگی false است؛ میتوان آن را در هر زمان تغییر داد.
- xmlparser.intern¶
دیکشنریِ مورد استفاده برای درونیسازی کردن نامهای المانها و ویژگیها. این دیکشنری یا همان دیکشنری است که به عنوان آرگومان intern تابع
ParserCreate()پاس داده شده است، یا یک دیکشنری جدید که برای این پارسر ایجاد شده است.
- xmlparser.namespace_prefixes¶
اگر به یک مقدار واقعی تنظیم شود، و پردازش فضای نام فعال باشد، پیشوند فضای نام به عنوان بخش سوم نام گسترشیافته گزارش میشود، جدا شده با جداکنندهی فضای نام. نامهایی که پیشوند ندارند تحت تأثیر قرار نمیگیرند. به طور پیشفرض، این ویژگی false است؛ میتواند در هر زمان تغییر کند.
ویژگیهای زیر شامل مقادیری مربوط به آخرین خطایی هستند که یک شیء xmlparser با آن مواجه شده است، و تنها زمانی مقادیر صحیح خواهند داشت که یک فراخوانی Parse() یا ParseFile() یک استثنا xml.parsers.expat.ExpatError را پرتاب کرده باشد.
- xmlparser.ErrorByteIndex¶
اندیس بایتی که خطا در آن رخ داد.
- xmlparser.ErrorCode¶
کد عددی که مشکل را مشخص میکند. این مقدار را میتوان به تابع
ErrorString()ارسال کرد یا با یکی از ثابتهای تعریفشده در شیءerrorsمقایسه کرد.
- xmlparser.ErrorColumnNumber¶
شمارهی ستونی که خطا در آن رخ داده است.
- xmlparser.ErrorLineNumber¶
شمارهی سطری که در آن خطایی رخ داده است.
ویژگیهای زیر شامل مقادیری مربوط به محل تجزیهی جاری در یک شیء xmlparser هستند. در حین یک کالبک که یک رویداد تجزیه را گزارش میکند، این ویژگیها محل نخستین نویسه از دنبالهای از نویسهها که رویداد را ایجاد کرده است نشان میدهند. هنگام فراخوانی خارج از یک کالبک، موقعیت نشاندادهشده درست پس از آخرین رویداد تجزیه خواهد بود (صرفنظر از اینکه کالبک مرتبطی وجود داشته باشد یا خیر).
- xmlparser.CurrentByteIndex¶
اندیس بایت جاری در ورودی پارسر.
- xmlparser.CurrentColumnNumber¶
شمارهی ستون جاری در ورودی پارسر.
- xmlparser.CurrentLineNumber¶
شماره خط جاری در ورودی پارسر .
در اینجا فهرستی از هندلرها که میتوان آنها را تنظیم کرد آمده است. برای تنظیم یک هندلر روی یک شیء xmlparser به نام o، از o.handlername = func استفاده کنید. handlername باید از فهرست زیر انتخاب شود، و func باید یک شیء فراخوانیپذیر باشد که تعداد صحیح آرگومانها را بپذیرد. همه آرگومانها رشته هستند، مگر آنکه خلاف آن ذکر شده باشد.
- xmlparser.XmlDeclHandler(version, encoding, standalone)¶
فراخوانی میشود وقتی اعلان XML تجزیه میشود. اعلان XML اعلانِ (اختیاری) نسخهی قابل اعمال توصیه XML، کدگذاری متن سند، و یک اعلان "standalone" اختیاری است. version و encoding رشتهها خواهند بود، و standalone برابر با
1خواهد بود اگر سند به صورت standalone اعلام شده باشد،0اگر اعلام شده باشد که standalone نیست، یا-1اگر بند standalone حذف شده باشد.
- xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)¶
فراخوانی میشود وقتی Expat تجزیه اعلان نوع سند (
<!DOCTYPE ...) را آغاز میکند. doctypeName دقیقاً همانگونه که ارائه شده است فراهم میشود. پارامترهای systemId و publicId شناسههای سیستمی و عمومی را در صورت تعیین شده ارائه میدهند، یاNoneدر صورت حذف. has_internal_subset برابر true خواهد بود اگر سند زیرمجموعهی اعلان داخلی سند را داشته باشد.
- xmlparser.EndDoctypeDeclHandler()¶
فراخوانی میشود وقتی Expat تجزیه اعلان نوع سند را تمام میکند.
- xmlparser.ElementDeclHandler(name, model)¶
برای هر اعلامیهی نوع عنصر یک بار فراخوانی میشود. name نام نوع عنصر است، و model نمایشی از مدل محتوا است.
- xmlparser.AttlistDeclHandler(elname, attname, type, default, required)¶
برای هر ویژگی اعلامشده برای یک نوع المان فراخوانی میشود. اگر یک اعلان فهرست ویژگی سه ویژگی اعلام کند، این هندلر سه بار فراخوانی میشود، یک بار برای هر ویژگی. elname نام المانی است که اعلان بر روی آن اعمال میشود و attname نام ویژگی اعلامشده است. نوع ویژگی یک رشته است که به عنوان type پاس داده میشود:
'CDATA'،'ID'،'IDREF'،'IDREFS'،'ENTITY'،'ENTITIES'،'NMTOKEN'یا'NMTOKENS'، یک شمارش مانند'(x|y)'، یا یک فهرست نمادگذاری مانند'NOTATION(n1|n2)'. default مقدار پیشفرض ویژگی را برای زمانی که ویژگی توسط نمونه سند مشخص نشده است ارائه میدهد، یاNoneاگر هیچ مقدار پیشفرضی وجود نداشته باشد (مقادیر#IMPLIED). اگر ویژگی در نمونه سند لازم باشد داده شود، required برابر true خواهد بود.
- xmlparser.StartElementHandler(name, attributes)¶
برای آغاز هر عنصر فراخوانی میشود. name یک رشته حاوی نام عنصر است، و attributes صفات عنصر است. اگر
ordered_attributesبرابر true باشد، این یک فهرست است (برای توضیح کاملordered_attributesرا ببینید). در غیر این صورت، یک دیکشنری است که نامها را به مقدارها نگاشت میکند.
- xmlparser.EndElementHandler(name)¶
برای پایان هر عنصر فراخوانی میشود.
- xmlparser.ProcessingInstructionHandler(target, data)¶
برای هر دستور پردازشی فراخوانی میشود.
- xmlparser.CharacterDataHandler(data)¶
برای دادههای نویسهای فراخوانی میشود. این متد برای دادههای نویسهای عادی، محتوای علامتگذاریشده CDATA و فضای خالی قابلچشمپوشی فراخوانی خواهد شد. برنامههایی که باید این حالتها را از هم تشخیص دهند، میتوانند از کالبکهای
StartCdataSectionHandler،EndCdataSectionHandlerوElementDeclHandlerبرای جمعآوری اطلاعات مورد نیاز استفاده کنند. توجه داشته باشید که دادههای نویسهای ممکن است حتی در صورت کوتاه بودن بخشبندی (chunking) شوند و بنابراین ممکن است بیش از یک فراخوانی برایCharacterDataHandler()دریافت کنید. برای جلوگیری از این موضوع، ویژگی نمونهbuffer_textرا رویTrueتنظیم کنید.
- xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName)¶
برای اعلانهای موجودیت تجزیهنشده (NDATA) فراخوانی میشود. اگر این هندلر تنظیم نشده باشد، چنین اعلانهایی توسط
EntityDeclHandlerگزارش داده میشوند، که برای کد جدید ترجیح داده میشود. (تابع زیرین در کتابخانه Expat منسوخ اعلام شده است.)
- xmlparser.EntityDeclHandler(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)¶
برای تمام اعلانهای موجودیت فراخوانی میشود. برای موجودیتهای پارامتر و داخلی، value یک رشته خواهد بود که محتوای اعلامشده موجودیت را میدهد؛ این برای موجودیتهای خارجی
Noneخواهد بود. پارامتر notationName برای موجودیتهای تجزیهشدهNoneخواهد بود، و نام نمادگذاری برای موجودیتهای تجزیهنشده. is_parameter_entity برابر true خواهد بود اگر موجودیت یک موجودیت پارامتر باشد یا false برای موجودیتهای عمومی (اکثر برنامهها فقط نیاز دارند به موجودیتهای عمومی توجه کنند).
- xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)¶
برای اعلانهای نمادگذاری (notation declarations) فراخوانی میشود. notationName، base، systemId و publicId در صورت ارائه شدن، رشته هستند. اگر شناسه عمومی ذکر نشده باشد، publicId برابر
Noneخواهد بود.
- xmlparser.StartNamespaceDeclHandler(prefix, uri)¶
هنگامی که یک عنصر شامل یک اعلان فضای نام باشد، فراخوانی میشود. اعلانهای فضای نام پیش از فراخوانی
StartElementHandlerبرای عنصری که اعلانها بر روی آن قرار گرفتهاند، پردازش میشوند.
- xmlparser.EndNamespaceDeclHandler(prefix)¶
هنگامی که به برچسب پایانی المانی حاوی اعلام فضای نام میرسیم، فراخوانی میشود. این به ازای هر اعلام فضای نام روی المان یک بار فراخوانی میشود، با ترتیب معکوس ترتیبی که
StartNamespaceDeclHandlerبرای نشان دادن آغاز محدودهی هر اعلام فضای نام فراخوانی شده بود. فراخوانیهای این هندلر پس ازEndElementHandlerمتناظر برای پایان المان انجام میشوند.
- xmlparser.CommentHandler(data)¶
برای کامنتها فراخوانی میشود. data متن کامنت است، بدون
'<!--'ابتدایی و'-->'انتهایی.
- xmlparser.StartCdataSectionHandler()¶
در آغاز یک بخش CDATA فراخوانی میشود. برای آنکه بتوان آغاز و پایان سینتکسی بخشهای CDATA را شناسایی کرد، به این مورد و
EndCdataSectionHandlerنیاز است.
- xmlparser.EndCdataSectionHandler()¶
در پایان یک بخش CDATA فراخوانی میشود.
- xmlparser.DefaultHandler(data)¶
برای هر نویسهای در سند XML که هیچ هندلری قابلاعمالی برای آن مشخص نشده باشد، فراخوانی میشود. این به معنای نویسههایی است که بخشی از ساختاری هستند که میتواند گزارش شود، اما هیچ هندلری برای آن تأمین نشده است.
- xmlparser.DefaultHandlerExpand(data)¶
این همانند
DefaultHandlerاست، اما گسترش موجودیتهای داخلی را بازدار نمیکند. ارجاع موجودیت به هندلر پیشفرض پاس داده نمیشود.
- xmlparser.NotStandaloneHandler()¶
اگر سند XML بهعنوان یک سند مستقل اعلام نشده باشد، فراخوانی میشود. این حالت زمانی رخ میدهد که یک زیرمجموعه خارجی یا ارجاعی به یک موجودیت پارامتری وجود داشته باشد، اما در اعلامیه XML مقدار standalone روی
yesتنظیم نشده باشد. اگر این هندلر0را برگرداند، پارسر یک خطایXML_ERROR_NOT_STANDALONEپرتاب خواهد کرد. اگر این هندلر تنظیم نشده باشد، پارسر برای این وضعیت هیچ استثنایی پرتاب نمیکند.
- xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)¶
هشدار
پیادهسازی یک هندلر که به پروندههای محلی و/یا شبکه دسترسی دارد، ممکن است در صورتی که از
xmlparserبا محتوای XML ارائهشده توسط کاربر استفاده شود، آسیبپذیری در برابر حملات موجودیت خارجی ایجاد کند. لطفاً پیش از پیادهسازی این هندلر، مدل تهدید خود را در نظر بگیرید.برای ارجاعها به موجودیتهای خارجی فراخوانی میشود. base پایه فعلی است که با فراخوانی پیشین
SetBase()تنظیم شده است. شناسههای عمومی و سیستمی، systemId و publicId، اگر ارائه شده باشند، رشته هستند؛ اگر شناسه عمومی ارائه نشده باشد، publicId برابرNoneخواهد بود. مقدار context مبهم است و باید فقط همانطور که در ادامه توضیح داده شده است استفاده شود.برای این که موجودیتهای خارجی تجزیه شوند، این هندلر باید پیادهسازی شود. این هندلر مسئول ایجاد پارسر فرعی با استفاده از
ExternalEntityParserCreate(context)، مقداردهی اولیهی آن با کالبکهای مناسب و تجزیهی موجودیت است. این هندلر باید یک عدد صحیح برگرداند؛ اگر0برگرداند، پارسر خطایXML_ERROR_EXTERNAL_ENTITY_HANDLINGرا پرتاب خواهد کرد، در غیر این صورت تجزیه ادامه خواهد یافت.اگر این هندلر فراهم نشده باشد، موجودیتهای خارجی توسط کالبک
DefaultHandlerگزارش داده میشوند، در صورتی که فراهم شده باشد.
- xmlparser.SkippedEntityHandler(entityName, is_parameter_entity)¶
برای ارجاعهای موجودیت که گسترش داده نشدهاند فراخوانی میشود، زیرا پارسر اعلان موجودیت را نخوانده است. این اتفاق میافتد وقتی که زیرمجموعهی خارجی DTD یا یک موجودیت پارامتر خارجی تجزیه نشده باشد. is_parameter_entity برای یک موجودیت پارامتر true و برای یک موجودیت عمومی false است.
استثناهای ExpatError¶
استثناهای ExpatError تعدادی ویژگی جالب دارند:
- ExpatError.code¶
شمارهی خطای داخلی Expat برای خطای مشخص. دیکشنری
errors.messagesاین شمارههای خطا را به پیامهای خطای Expat نگاشت میکند. برای مثال:from xml.parsers.expat import ParserCreate, ExpatError, errors p = ParserCreate() try: p.Parse(some_xml_document) except ExpatError as err: print("Error:", errors.messages[err.code])
ماژول
errorsهمچنین ثابتهای پیام خطا و دیکشنریcodesرا ارائه میدهد که این پیامها را به کدهای خطا نگاشت میکند، در زیر ببینید.
- ExpatError.lineno¶
شمارهی سطری که خطا در آن تشخیص داده شد. اولین خط با شمارهی
1شمارهگذاری شده است.
- ExpatError.offset¶
آفست نویسهای در سطری که خطا در آن رخ داده است. شمارهی اولین ستون
0است.
مثال¶
برنامه زیر ۳ هندلر تعریف میکند که فقط آرگومانهای خود را چاپ میکنند.
import xml.parsers.expat
# 3 handler functions
def start_element(name, attrs):
print('Start element:', name, attrs)
def end_element(name):
print('End element:', name)
def char_data(data):
print('Character data:', repr(data))
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data
p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)
خروجی این برنامه:
Start element: parent {'id': 'top'}
Start element: child1 {'name': 'paul'}
Character data: 'Text goes here'
End element: child1
Character data: '\n'
Start element: child2 {'name': 'fred'}
Character data: 'More text'
End element: child2
Character data: '\n'
End element: parent
توصیفهای مدل محتوا¶
مدلهای محتوا با استفاده از تاپلهای تودرتو توصیف میشوند. هر تاپل شامل چهار مقدار است: نوع، کمیتگذار، نام، و یک تاپل از فرزندان. فرزندان صرفاً توصیفهای اضافی مدل محتوا هستند.
مقادیر دو فیلد نخست، ثابتهای تعریفشده در ماژول xml.parsers.expat.model هستند. این ثابتها را میتوان در دو گروه دستهبندی کرد: گروه نوع مدل و گروه کمیتگذار.
ثابتهای گروه نوع مدل عبارتند از:
- xml.parsers.expat.model.XML_CTYPE_ANY¶
برای عنصر نامگذاریشده با نام مدل، مدل محتوای
ANYاعلام شده بود.
- xml.parsers.expat.model.XML_CTYPE_CHOICE¶
عنصر نامدار امکان انتخاب از میان تعدادی گزینه را فراهم میکند؛ این برای مدلهای محتوا مانند
(A | B | C)استفاده میشود.
- xml.parsers.expat.model.XML_CTYPE_EMPTY¶
عناصری که بهصورت
EMPTYاعلام شدهاند، این نوع مدل را دارند.
- xml.parsers.expat.model.XML_CTYPE_MIXED¶
المان نامگذاریشده دادهی نویسه را مجاز میدارد، بهصورت اختیاری درهمتنیده با فرزندان نامگذاریشده؛ این برای مدلهای محتوا مانند
(#PCDATA)و(#PCDATA | A | B)*استفاده میشود.
- xml.parsers.expat.model.XML_CTYPE_NAME¶
مدل یک المان منفرد را نامگذاری میکند، همانند
A.
- xml.parsers.expat.model.XML_CTYPE_SEQ¶
مدلهایی که یک رشته از مدلهای متوالی را نشان میدهند، با این نوع مدل مشخص میشوند. این برای مدلهایی مانند
(A, B, C)به کار میرود.
ثابتهای گروه کمیتگذار عبارتند از:
- xml.parsers.expat.model.XML_CQUANT_NONE¶
هیچ تغییردهندهای داده نشده است، بنابراین میتواند دقیقاً یک بار ظاهر شود، مانند
A.
- xml.parsers.expat.model.XML_CQUANT_OPT¶
مدل اختیاری است: میتواند یک بار ظاهر شود یا اصلاً ظاهر نشود، مانند
A?.
- xml.parsers.expat.model.XML_CQUANT_PLUS¶
مدل باید یک یا چند بار تکرار شود (مانند
A+).
- xml.parsers.expat.model.XML_CQUANT_REP¶
مدل باید صفر یا چند بار تکرار شود، مانند
A*.
ثابتهای خطای Expat¶
ثابتهای زیر در ماژول xml.parsers.expat.errors ارائه شدهاند. این ثابتها برای تفسیر برخی از ویژگیهای اشیای استثنای ExpatError که هنگام وقوع خطا پرتاب میشوند، مفید هستند. از آنجا که به دلایل سازگاری با نسخههای قدیمی، مقدار ثابتها پیام خطا است، نه کد خطای عددی، این کار را با مقایسهی ویژگی code آن با errors.codes[errors.XML_ERROR_CONSTANT_NAME] انجام دهید.
ماژول errors دارای ویژگیهای زیر است:
- xml.parsers.expat.errors.codes¶
یک دیکشنری که توضیحات رشتهای را به کدهای خطای آنها نگاشت میکند.
اضافه شده در نسخهی 3.2.
- xml.parsers.expat.errors.messages¶
یک دیکشنری که کدهای خطای عددی را به توضیحات رشتهای آنها نگاشت میکند.
اضافه شده در نسخهی 3.2.
- xml.parsers.expat.errors.XML_ERROR_ASYNC_ENTITY¶
- xml.parsers.expat.errors.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF¶
یک ارجاع به موجودیت در مقدار یک ویژگی، بهجای یک موجودیت داخلی، به یک موجودیت خارجی اشاره داشت.
- xml.parsers.expat.errors.XML_ERROR_BAD_CHAR_REF¶
یک ارجاع نویسه به نویسهای اشاره میکرد که در XML غیرمجاز است (برای مثال، نویسهی
0، یا '�').
- xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF¶
یک ارجاع موجودیت (entity reference) به موجودیتی اشاره داشت که با یک نمادگذاری اعلام شده بود، بنابراین نمیتوان آن را تجزیه (parse) کرد.
- xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE¶
یک ویژگی بیش از یک بار در یک برچسب شروع استفاده شده است.
- xml.parsers.expat.errors.XML_ERROR_INCORRECT_ENCODING¶
- xml.parsers.expat.errors.XML_ERROR_INVALID_TOKEN¶
هنگامی پرتاب میشود که نتوان یک بایت ورودی را بهدرستی به یک نویسه اختصاص داد؛ برای مثال، یک بایت NUL (با مقدار
0) در یک جریان ورودی UTF-8.
- xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT¶
پس از عنصر سند، چیزی جز فضای سفید رخ داد.
- xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI¶
یک اعلان XML در جایی غیر از ابتدای داده ورودی یافت شد.
- xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS¶
سند هیچ المانی ندارد (XML میطلبد که همهی اسناد دقیقاً یک المان سطحبالا داشته باشند).
- xml.parsers.expat.errors.XML_ERROR_NO_MEMORY¶
Expat نتوانست حافظه را بهصورت داخلی تخصیص دهد.
- xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF¶
ارجاعی به موجودیت پارامتری در جایی یافت شد که مجاز نبود.
- xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR¶
یک نویسهی ناقص در ورودی یافت شد.
- xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF¶
یک ارجاع موجودیت شامل ارجاع دیگری به همان موجودیت بود؛ احتمالاً از طریق نامی متفاوت، و احتمالاً بهطور غیرمستقیم.
- xml.parsers.expat.errors.XML_ERROR_SYNTAX¶
یک خطای سینتکسی نامشخص رخ داد.
- xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH¶
یک برچسب پایان با داخلیترین برچسب شروع باز مطابقت نداشت.
- xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN¶
توکنی (مانند برچسب شروع) پیش از پایان جریان یا برخورد با توکن بعدی بسته نشده بود.
- xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY¶
ارجاعی به یک موجودیت تعریفنشده داده شده است.
- xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING¶
کدگذاری سند توسط Expat پشتیبانی نمیشود.
- xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION¶
یک بخش نمادگذاریشدهی CDATA بسته نشده است.
- xml.parsers.expat.errors.XML_ERROR_EXTERNAL_ENTITY_HANDLING¶
- xml.parsers.expat.errors.XML_ERROR_NOT_STANDALONE¶
پارسر تشخیص داد که سند «مستقل» نیست، هرچند در اعلان XML خود را مستقل اعلام کرده بود، و
NotStandaloneHandlerتنظیم شده بود و0را برگرداند.
- xml.parsers.expat.errors.XML_ERROR_UNEXPECTED_STATE¶
- xml.parsers.expat.errors.XML_ERROR_ENTITY_DECLARED_IN_PE¶
- xml.parsers.expat.errors.XML_ERROR_FEATURE_REQUIRES_XML_DTD¶
عملیاتی درخواست شد که نیاز دارد پشتیبانی DTD در Expat کامپایلشده باشد، اما Expat بدون پشتیبانی DTD پیکربندی شده است. این مورد هرگز نباید در ساخت استاندارد ماژول
xml.parsers.expatگزارش شود.
- xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING¶
تغییری در رفتار پس از شروع تجزیه درخواست شد که فقط پیش از شروع تجزیه میتوان آن را تغییر داد. این مورد (در حال حاضر) فقط توسط
UseForeignDTD()پرتاب میشود.
- xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX¶
هنگامی که پردازش فضای نام فعال بود، یک پیشوند اعلامنشده یافت شد.
- xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX¶
سند تلاش کرد اعلامیهی فضای نام مرتبط با یک پیشوند را حذف کند.
- xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE¶
یک موجودیت پارامتر (parameter entity) شامل نمادگذاری ناقص بود.
- xml.parsers.expat.errors.XML_ERROR_XML_DECL¶
خطایی در تجزیه اعلان XML رخ داد.
- xml.parsers.expat.errors.XML_ERROR_TEXT_DECL¶
هنگام تجزیهی یک اعلامیهی متنی در یک موجودیت خارجی، خطایی رخ داد.
- xml.parsers.expat.errors.XML_ERROR_PUBLICID¶
نویسههایی که مجاز نیستند، در شناسه عمومی یافت شدند.
- xml.parsers.expat.errors.XML_ERROR_SUSPENDED¶
عملیات درخواستشده روی یک پارسر تعلیقشده انجام شد، اما مجاز نیست. این شامل تلاشهایی برای ارائه ورودی اضافی یا متوقف کردن پارسر است.
- xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED¶
تلاشی برای از سرگیری پارسر انجام شد، در حالی که پارسر معلق نشده بود.
- xml.parsers.expat.errors.XML_ERROR_ABORTED¶
این نباید به برنامههای پایتون گزارش شود.
- xml.parsers.expat.errors.XML_ERROR_FINISHED¶
عملیات درخواستشده روی پارسری انجام شد که تجزیه ورودی را به پایان رسانده بود، اما این کار مجاز نیست. این شامل تلاشها برای فراهم کردن ورودی اضافی یا متوقف کردن پارسر میشود.
- xml.parsers.expat.errors.XML_ERROR_SUSPEND_PE¶
- xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XML¶
تلاشی برای لغو تعریف پیشوند فضای نام رزروشده
xmlیا مقیدسازی آن به URI یک فضای نام دیگر انجام شد.
- xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XMLNS¶
تلاشی برای اعلام یا لغو اعلام پیشوند فضای نام محفوظ
xmlnsانجام شد.
- xml.parsers.expat.errors.XML_ERROR_RESERVED_NAMESPACE_URI¶
تلاشی برای اتصال URI یکی از پیشوندهای فضای نام رزروشده
xmlوxmlnsبه یک پیشوند فضای نام دیگر انجام شد.
- xml.parsers.expat.errors.XML_ERROR_INVALID_ARGUMENT¶
این نباید به برنامههای پایتون گزارش شود.
- xml.parsers.expat.errors.XML_ERROR_NO_BUFFER¶
این نباید به برنامههای پایتون گزارش شود.
- xml.parsers.expat.errors.XML_ERROR_AMPLIFICATION_LIMIT_BREACH¶
از حد مجاز ضریب تقویت ورودی (input amplification factor) ناشی از DTD و موجودیتها فراتر رفته است.
- xml.parsers.expat.errors.XML_ERROR_NOT_STARTED¶
تلاش شد تا پارسر پیش از شروع متوقف یا معلق شود.
اضافه شده در نسخهی 3.14.
پانویسها