xml.sax.handler --- کلاسهای پایه برای هندلرهای SAX¶
کد منبع: Lib/xml/sax/handler.py
API مربوط به SAX پنج نوع هندلر را تعریف میکند: هندلرهای محتوا، هندلرهای DTD، هندلرهای خطا، حلکنندههای موجودیت و هندلرهای واژگانی. برنامهها معمولاً فقط نیاز دارند آن رابطهایی را پیادهسازی کنند که به رویدادهای آنها علاقهمند هستند؛ آنها میتوانند رابطها را در یک شیء یا در چند شیء پیادهسازی کنند. پیادهسازیهای هندلر باید از کلاسهای پایه ارائهشده در ماژول xml.sax.handler ارثبری کنند، تا همهی متدها پیادهسازیهای پیشفرض داشته باشند.
- class xml.sax.handler.ContentHandler¶
این رابط کالبک اصلی در SAX و مهمترین رابط برای برنامههای کاربردی است. ترتیب رویدادها در این رابط، ترتیب اطلاعات در سند را منعکس میکند.
- class xml.sax.handler.DTDHandler¶
مدیریت رویدادهای DTD.
این رابط فقط رویدادهای DTD مورد نیاز برای تجزیهی پایه (موجودیتهای تجزیهنشده و ویژگیها) را مشخص میکند.
- class xml.sax.handler.EntityResolver¶
رابط پایه برای حل موجودیتها. اگر یک شیء ایجاد کنید که این رابط را پیادهسازی میکند، سپس آن شیء را در پارسر خود ثبت کنید، پارسر متد موجود در شیء شما را برای حل تمام موجودیتهای خارجی فراخوانی خواهد کرد.
- class xml.sax.handler.ErrorHandler¶
رابطی که پارسر برای ارائه پیامهای خطا و هشدار به برنامه از آن استفاده میکند. متدهای این شیء تعیین میکنند که آیا خطاها بلافاصله به استثناها تبدیل میشوند یا به روش دیگری رسیدگی میشوند.
- class xml.sax.handler.LexicalHandler¶
رابطی که پارسر برای بازنمایی رویدادهای کمتکرار استفاده میکند، که ممکن است برای بسیاری از برنامهها مورد توجه نباشند.
علاوه بر این کلاسها، xml.sax.handler ثابتهای نمادینی را برای نام قابلیتها و ویژگیها فراهم میکند.
- xml.sax.handler.feature_namespaces¶
- مقدار:
"http://xml.org/sax/features/namespaces"true: پردازش فضای نام انجام شود.false: بهصورت اختیاری، پردازش فضای نام انجام نشود (مستلزم namespace-prefixes؛ پیشفرض).دسترسی: (تجزیه) فقط خواندنی؛ (بدون تجزیه) خواندن/نوشتن
- xml.sax.handler.feature_namespace_prefixes¶
- مقدار:
"http://xml.org/sax/features/namespace-prefixes"true: نامهای اصلی دارای پیشوند و ویژگیهای مورد استفاده برای اعلامیههای فضای نام را گزارش میدهد.false: ویژگیهای استفادهشده برای اعلانهای فضای نام را گزارش نمیکند، و بهصورت اختیاری نامهای پیشونددار اصلی را گزارش نمیکند (پیشفرض).دسترسی: (تجزیه) فقط خواندنی؛ (بدون تجزیه) خواندن/نوشتنThe parser based on
xml.parsers.expatdoes not support this feature.
- xml.sax.handler.feature_string_interning¶
- مقدار:
"http://xml.org/sax/features/string-interning"true: All element names, prefixes, attribute names, Namespace URIs, and local names are interned in a dictionary (seeproperty_interning_dict).false: نامها لزوماً درونیسازیشده نیستند، اگرچه ممکن است اینطور باشند (پیشفرض).دسترسی: (تجزیه) فقط خواندنی؛ (بدون تجزیه) خواندن/نوشتن
- xml.sax.handler.feature_validation¶
- مقدار:
"http://xml.org/sax/features/validation"true: تمام خطاهای اعتبارسنجی را گزارش میدهد (external-general-entities و external-parameter-entities را نیز فعال میکند).false: خطاهای اعتبارسنجی گزارش داده نمیشوند.دسترسی: (تجزیه) فقط خواندنی؛ (بدون تجزیه) خواندن/نوشتنThe parser based on
xml.parsers.expatdoes not support this feature, because Expat is a non-validating parser.
- xml.sax.handler.feature_external_ges¶
هشدار
فعالسازی این قابلیت، در صورتی که پارسر با محتوای XML ارائهشده توسط کاربر استفاده شود، آسیبپذیری در برابر حملات موجودیت خارجی ایجاد میکند. لطفاً پیش از فعالسازی این قابلیت، مدل تهدید خود را بررسی کنید.
مقدار:"http://xml.org/sax/features/external-general-entities"true: همهی موجودیتهای عمومی خارجی (متنی) را شامل میشود.false: موجودیتهای عمومی خارجی را شامل نمیشود.دسترسی: (تجزیه) فقط خواندنی؛ (بدون تجزیه) خواندن/نوشتن
- xml.sax.handler.feature_external_pes¶
- مقدار:
"http://xml.org/sax/features/external-parameter-entities"true: شامل تمام موجودیتهای پارامتری خارجی، از جمله زیرمجموعهی DTD خارجی میشود.نادرست: هیچ موجودیت پارامتر خارجی، حتی زیرمجموعه DTD خارجی، را شامل نکنید.دسترسی: (تجزیه) فقط خواندنی؛ (بدون تجزیه) خواندن/نوشتنThe parser based on
xml.parsers.expatdoes not support this feature.
- xml.sax.handler.all_features¶
فهرست تمام قابلیتها.
- xml.sax.handler.property_lexical_handler¶
- مقدار:
"http://xml.org/sax/properties/lexical-handler"data type:LexicalHandlerتوضیحات: یک هندلر افزونهای اختیاری برای رویدادهای واژگانی مانند کامنتها.دسترسی: خواندن/نوشتن
- xml.sax.handler.property_declaration_handler¶
- مقدار:
"http://xml.org/sax/properties/declaration-handler"data type: an object implementing the SAX2DeclHandlerinterfaceتوضیحات: یک هندلر افزونهای اختیاری برای رویدادهای مرتبط با DTD، بهجز نشانگذاریها و موجودیتهای تجزیهنشده.دسترسی: خواندن/نوشتنNo parser in the standard library supports this property, and the standard library provides no such handler.
- xml.sax.handler.property_dom_node¶
- مقدار:
"http://xml.org/sax/properties/dom-node"data type:xml.dom.Nodeتوضیح: هنگام تجزیه، گره DOM جاری که بازدید میشود، اگر این یک پیمایشگر DOM باشد؛ هنگامی که تجزیه انجام نمیشود، گره DOM ریشه برای پیمایش.دسترسی: (تجزیه) فقط خواندنی؛ (بدون تجزیه) خواندن/نوشتنNo parser in the standard library supports this property.
- xml.sax.handler.property_xml_string¶
- مقدار:
"http://xml.org/sax/properties/xml-string"نوع داده: بایتهاتوضیح: رشتهای لفظی از نویسهها که منبع رویداد جاری بود.access: read-only, and only during a handler callback
- xml.sax.handler.property_encoding¶
- value:
"http://www.python.org/sax/properties/encoding"data type: Stringdescription: The name of the encoding to assume for input data.دسترسی: خواندن/نوشتنNo parser in the standard library supports this property.
- xml.sax.handler.property_interning_dict¶
- value:
"http://www.python.org/sax/properties/interning-dict"data type: Dictionarydescription: The dictionary used to intern names, orNoneif names are not interned. Setting it enables interning, as does thefeature_string_interningfeature.دسترسی: خواندن/نوشتن
- xml.sax.handler.all_properties¶
فهرست تمام نامهای ویژگیهای شناختهشده.
اشیای ContentHandler¶
انتظار میرود کاربران برای پشتیبانی از برنامهی خود، یک زیرکلاس از ContentHandler ایجاد کنند. متدهای زیر توسط پارسر در رویدادهای مناسب در سند ورودی فراخوانی میشوند:
- ContentHandler.setDocumentLocator(locator)¶
توسط پارسر فراخوانی میشود تا یک مکانیاب برای یافتن منشأ رویدادهای سند در اختیار برنامه قرار دهد.
بهشدت توصیه میشود (هرچند بهطور مطلق الزامی نیست) که پارسرهای SAX یک مکانیاب فراهم کنند: اگر این کار را انجام دهند، باید مکانیاب را با فراخوانی این متد، پیش از فراخوانی هر یک از متدهای دیگر در رابط DocumentHandler، در اختیار برنامه قرار دهند.
مکانیاب به برنامه اجازه میدهد موقعیت پایانی هر رویداد مرتبط با سند را تعیین کند، حتی اگر پارسر خطایی گزارش نکند. معمولاً برنامه از این اطلاعات برای گزارش خطاهای خود استفاده میکند (مانند محتوای نویسهای که با قوانین تجاری برنامه مطابقت ندارد). اطلاعاتی که مکانیاب برمیگرداند احتمالاً برای استفاده در یک موتور جستجو کافی نیست.
توجه داشته باشید که مکانیاب (locator) اطلاعات صحیح را فقط در حین فراخوانی رویدادها در این رابط برمیگرداند. برنامه نباید در هیچ زمان دیگری سعی در استفاده از آن کند.
- ContentHandler.startDocument()¶
دریافت اعلان آغاز یک سند.
پارسر SAX این متد را فقط یکبار، پیش از هر متد دیگری در این رابط یا در DTDHandler (بهجز
setDocumentLocator()) فراخوانی خواهد کرد.
- ContentHandler.endDocument()¶
دریافت اعلان پایان یک سند.
پارسر SAX این متد را تنها یک بار فراخوانی میکند، و این آخرین متدی خواهد بود که در حین پارس فراخوانی میشود. پارسر این متد را فراخوانی نخواهد کرد، مگر اینکه یا پارس کردن را رها کرده باشد (به دلیل خطای غیرقابل بازیابی) یا به پایان ورودی رسیده باشد.
- ContentHandler.startPrefixMapping(prefix, uri)¶
آغاز محدودهی یک نگاشت فضای نام پیشوند-URI.
اطلاعات حاصل از این رویداد برای پردازش عادی فضای نام ضروری نیست: خواننده SAX XML هنگامی که قابلیت
feature_namespacesفعال باشد (حالت پیشفرض)، پیشوندهای نام عناصر و ویژگیها را بهطور خودکار جایگزین میکند.با این حال، مواردی وجود دارد که برنامهها نیاز دارند از پیشوندها در دادههای نویسهای یا در مقدارهای ویژگی استفاده کنند، مواردی که نمیتوان پیشوندها را در آنها بهصورت ایمن بهطور خودکار بسط داد؛ رویدادهای
startPrefixMapping()وendPrefixMapping()اطلاعات را در اختیار برنامه قرار میدهند تا در صورت لزوم، خود برنامه پیشوندها را در آن زمینهها بسط دهد.توجه داشته باشید که تضمینی وجود ندارد که رویدادهای
startPrefixMapping()وendPrefixMapping()بهدرستی نسبت به یکدیگر تودرتو باشند: تمام رویدادهایstartPrefixMapping()پیش از رویداد متناظرstartElement()رخ خواهند داد، و تمام رویدادهایendPrefixMapping()پس از رویداد متناظرendElement()رخ خواهند داد، اما ترتیب آنها تضمین نمیشود.
- ContentHandler.endPrefixMapping(prefix)¶
پایان دادن به محدودهی یک نگاشت prefix-URI.
برای جزئیات،
startPrefixMapping()را ببینید. این رویداد همواره پس از رویداد متناظرendElement()رخ میدهد، اما بهجز این، ترتیب رویدادهایendPrefixMapping()تضمین نمیشود.
- ContentHandler.startElement(name, attrs)¶
آغاز یک عنصر را در حالت بدون فضای نام اعلام میکند.
پارامتر name شامل نام خام XML 1.0 برای نوع عنصر بهصورت یک رشته است و پارامتر attrs شیءای از رابط Attributes را نگه میدارد که ویژگیهای عنصر را شامل میشود. شیءای که بهعنوان attrs ارسال میشود ممکن است توسط پارسر دوباره استفاده شود؛ نگهداشتن ارجاع به آن روش قابلاطمینانی برای حفظ یک کپی از ویژگیها نیست. برای نگهداشتن یک کپی از ویژگیها، از متد
copy()شیء attrs استفاده کنید.
- ContentHandler.endElement(name)¶
پایان یک عنصر را در حالت بدون فضای نام اعلام میکند.
پارامتر name شامل نام نوع عنصر است، درست مانند رویداد
startElement().
- ContentHandler.startElementNS(name, qname, attrs)¶
آغاز یک عنصر را در حالت فضای نام اعلام میکند.
پارامتر name شامل نام نوع عنصر بهصورت یک تاپل
(uri, localname)است، پارامتر qname شامل نام خام XML 1.0 بهکاررفته در سند منبع است، و پارامتر attrs یک نمونه از رابط AttributesNS را نگه میدارد که شامل ویژگیهای عنصر است. اگر هیچ فضای نامی به عنصر مرتبط نباشد، کامپوننت uri از name برابرNoneخواهد بود. ممکن است شیء ارسالشده بهعنوان attrs توسط پارسر دوباره استفاده شود؛ نگهداشتن یک ارجاع به آن، راه قابلاعتمادی برای حفظ یک نسخه از ویژگیها نیست. برای حفظ یک نسخه از ویژگیها، از متدcopy()شیء attrs استفاده کنید.پارسرها میتوانند پارامتر qname را روی
Noneتنظیم کنند، مگر آنکه قابلیتfeature_namespace_prefixesفعال شده باشد.
- ContentHandler.endElementNS(name, qname)¶
پایان یک عنصر را در حالت فضای نام اعلام میکند.
پارامتر name شامل نام نوع المان است، همانطور که در متد
startElementNS()وجود دارد، و پارامتر qname نیز به همین صورت است.
- ContentHandler.characters(content)¶
دریافت اعلان دادههای نویسهای.
پارسر این متد را برای گزارش هر تکه از دادههای نویسهای فراخوانی خواهد کرد. پارسرهای SAX ممکن است تمام دادههای نویسهای پیوسته را در یک تکه برگردانند، یا آن را به چند تکه تقسیم کنند؛ با این حال، تمام نویسههای هر رویداد واحد باید از یک موجودیت خارجی یکسان آمده باشند تا Locator اطلاعات مفیدی فراهم کند.
content ممکن است یک نمونه از رشته یا bytes باشد؛ ماژول خوانندهی
expatهمیشه رشته تولید میکند.توجه
رابط SAX 1 پیشین که توسط Python XML Special Interest Group ارائهشده بود، برای این متد از یک رابط شبیهتر به Java استفاده میکرد. از آنجا که بیشتر پارسرهای استفادهشده از Python از رابط قدیمیتر بهره نمیبردند، امضای سادهتر برای جایگزینی آن انتخاب شد. برای تبدیل کد قدیمی به رابط جدید، بهجای اسلایس محتوا با پارامترهای قدیمی offset و length، از content استفاده کنید.
- ContentHandler.ignorableWhitespace(whitespace)¶
دریافت اعلان مربوط به فضای سفید قابلچشمپوشی در محتوای عنصر.
پارسرهای اعتبارسنج باید از این متد برای گزارش هر تکه از فضای سفید قابل چشمپوشی استفاده کنند (به توصیهنامه W3C برای XML 1.0، بخش 2.10 مراجعه کنید): پارسرهای غیراعتبارسنج نیز در صورتی میتوانند از این متد استفاده کنند که قادر به تجزیه و استفاده از مدلهای محتوا باشند.
پارسرهای SAX ممکن است تمام فضای سفید پیوسته را در یک تکه برگردانند، یا ممکن است آن را به چند تکه تقسیم کنند؛ با این حال، تمام نویسههای هر رویداد واحد باید از یک موجودیت خارجی (external entity) یکسان آمده باشند، تا Locator اطلاعات مفیدی ارائه دهد.
- ContentHandler.processingInstruction(target, data)¶
دریافت اعلان یک دستور پردازشی.
پارسر این متد را یکبار بهازای هر دستورالعمل پردازشی (processing instruction) که یافت شود فراخوانی میکند: توجه داشته باشید که دستورالعملهای پردازشی ممکن است پیش یا پس از المان اصلی سند رخ دهند.
پارسر SAX هرگز نباید اعلامیه XML (XML 1.0، بخش 2.8) یا اعلامیه متن (XML 1.0، بخش 4.3.1) را با استفاده از این متد گزارش کند.
- ContentHandler.skippedEntity(name)¶
دریافت اعلان رد شدن یک موجودیت.
پارسر این متد را یک بار برای هر موجودیتی که رد میشود فراخوانی میکند. پردازندههای بدون اعتبارسنجی ممکن است موجودیتها را رد کنند، اگر اعلانها را ندیده باشند (زیرا، برای مثال، آن موجودیت در یک زیرمجموعهی خارجی DTD اعلان شده است). همهی پردازندهها ممکن است موجودیتهای خارجی را رد کنند، بسته به مقادیر ویژگیهای
feature_external_gesوfeature_external_pes.
اشیای DTDHandler¶
نمونههای DTDHandler متدهای زیر را فراهم میکنند:
- DTDHandler.notationDecl(name, publicId, systemId)¶
مدیریت رویداد اعلان نماد .
- DTDHandler.unparsedEntityDecl(name, publicId, systemId, ndata)¶
رویداد اعلام موجودیت تجزیهنشده را مدیریت میکند.
اشیای EntityResolver¶
- EntityResolver.resolveEntity(publicId, systemId)¶
شناسه سیستمی یک موجودیت را حل کنید و یا شناسه سیستمی برای خواندن را بهصورت یک رشته، یا یک InputSource برای خواندن برگردانید. پیادهسازی پیشفرض systemId را برمیگرداند.
اشیای ErrorHandler¶
از اشیایی که این رابط را دارند برای دریافت اطلاعات خطا و هشدار از XMLReader استفاده میشود. اگر شیءای ایجاد کنید که این رابط را پیادهسازی کند و سپس آن شیء را در XMLReader خود ثبت کنید، پارسر متدهای موجود در شیء شما را برای گزارش تمام هشدارها و خطاها فراخوانی خواهد کرد. ۳ سطح خطا در دسترس است: هشدارها، خطاهای (احتمالاً) قابل بازیابی، و خطاهای غیرقابل بازیابی. تمام متدها یک SAXParseException را بهعنوان تنها پارامتر میگیرند. با پرتاب شیء استثنای دادهشده میتوان خطاها و هشدارها را به یک استثنا تبدیل کرد.
- ErrorHandler.error(exception)¶
هنگامی فراخوانی میشود که پارسر با یک خطای قابل بازیابی مواجه شود. اگر این متد استثنایی را پرتاب نکند، ممکن است تجزیه ادامه یابد، اما برنامه نباید انتظار اطلاعات بیشتری از سند را داشته باشد. اجازه دادن به پارسر برای ادامه ممکن است امکان کشف خطاهای بیشتر در سند ورودی را فراهم کند.
- ErrorHandler.fatalError(exception)¶
هنگامی فراخوانی میشود که پارسر با خطایی مواجه شود که امکان بازیابی از آن وجود ندارد؛ انتظار میرود تجزیه با بازگشت این متد خاتمه یابد.
- ErrorHandler.warning(exception)¶
این متد زمانی فراخوانی میشود که پارسر اطلاعات هشدار جزئی را به برنامه ارائه میدهد. انتظار میرود پس از بازگشت این متد، تجزیه ادامه یابد و اطلاعات سند همچنان به برنامه ارسال شود. پرتاب یک استثنا در این متد باعث پایان تجزیه خواهد شد.
اشیای LexicalHandler¶
هندلر اختیاری SAX2 برای رویدادهای واژگانی.
این هندلر برای دریافت اطلاعات واژگانی دربارهی یک سند XML استفاده میشود. اطلاعات واژگانی شامل اطلاعات توصیفکنندهی کدگذاری استفادهشده در سند و کامنتها XML نهفته در سند، و همچنین مرزهای بخش DTD و هر بخش CDATA است. هندلرهای واژگانی به همان شیوهی هندلرهای محتوا استفاده میشوند.
برای تنظیم LexicalHandler یک XMLReader، از متد setProperty با شناسهی ویژگی 'http://xml.org/sax/properties/lexical-handler' استفاده کنید.
- LexicalHandler.comment(content)¶
یک کامنت را در هر جایی از سند (از جمله DTD و خارج از عنصر سند) گزارش میدهد.
- LexicalHandler.startDTD(name, public_id, system_id)¶
در صورتی که سند دارای DTD مرتبطی باشد، آغاز اعلامیههای DTD را گزارش میکند.
- LexicalHandler.endDTD()¶
پایان اعلان DTD را گزارش میدهد.
- LexicalHandler.startCDATA()¶
آغاز یک بخش نمادگذاریشدهی CDATA را گزارش میکند.
محتوای بخش علامتگذاریشده CDATA از طریق هندلر نویسهها گزارش میشود.
- LexicalHandler.endCDATA()¶
پایان یک بخش نمادگذاریشده CDATA را گزارش میدهد.