uTools-Manuals/docs/python/xml.sax.html
2019-04-08 23:22:26 +08:00

1 line
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-xml.sax"><h1><span class="yiyi-st" id="yiyi-10">20.9. <a class="reference internal" href="#module-xml.sax" title="xml.sax: Package containing SAX2 base classes and convenience functions."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax</span></code></a> - 支持SAX2解析器</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/xml/sax/__init__.py">Lib / xml / sax / __ init __。py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-xml.sax" title="xml.sax: Package containing SAX2 base classes and convenience functions."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax</span></code></a>包提供了许多实现Python的Simple API for XMLSAX接口的模块。</span><span class="yiyi-st" id="yiyi-13">软件包本身提供SAX异常和SAX API的用户最常用的方便功能。</span></p><div class="admonition warning"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-14">警告</span></p><p class="last"><span class="yiyi-st" id="yiyi-15"><a class="reference internal" href="#module-xml.sax" title="xml.sax: Package containing SAX2 base classes and convenience functions."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax</span></code></a>模块对于恶意构造的数据不安全。</span><span class="yiyi-st" id="yiyi-16">如果需要解析不受信任或未经身份验证的数据,请参阅<a class="reference internal" href="xml.html#xml-vulnerabilities"><span>XML vulnerabilities</span></a></span></p></div><p><span class="yiyi-st" id="yiyi-17">方便的功能有:</span></p><dl class="function"><dt id="xml.sax.make_parser"><span class="yiyi-st" id="yiyi-18"> <code class="descclassname">xml.sax.</code><code class="descname">make_parser</code><span class="sig-paren">(</span><em>parser_list=[]</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-19">创建并返回SAX <a class="reference internal" href="xml.sax.reader.html#xml.sax.xmlreader.XMLReader" title="xml.sax.xmlreader.XMLReader"><code class="xref py py-class docutils literal"><span class="pre">XMLReader</span></code></a>对象。</span><span class="yiyi-st" id="yiyi-20">将使用找到的第一个解析器。</span><span class="yiyi-st" id="yiyi-21">如果提供了<em>parser_list</em>,它必须是一串字符串,它命名具有名为<code class="xref py py-func docutils literal"><span class="pre">create_parser()</span></code>的函数的模块。</span><span class="yiyi-st" id="yiyi-22"><em>parser_list</em>中列出的模块将在默认的解析器列表中的模块之前使用。</span></p></dd></dl><dl class="function"><dt id="xml.sax.parse"><span class="yiyi-st" id="yiyi-23"> <code class="descclassname">xml.sax.</code><code class="descname">parse</code><span class="sig-paren">(</span><em>filename_or_stream</em>, <em>handler</em>, <em>error_handler=handler.ErrorHandler()</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-24">创建一个SAX解析器并使用它来解析文档。</span><span class="yiyi-st" id="yiyi-25">作为<em>filename_or_stream</em>传入的文档可以是文件名或文件对象。</span><span class="yiyi-st" id="yiyi-26"><em>处理程序</em>参数需要是SAX <a class="reference internal" href="xml.sax.handler.html#xml.sax.handler.ContentHandler" title="xml.sax.handler.ContentHandler"><code class="xref py py-class docutils literal"><span class="pre">ContentHandler</span></code></a>实例。</span><span class="yiyi-st" id="yiyi-27">如果给出<em>error_handler</em>它必须是SAX <a class="reference internal" href="xml.sax.handler.html#xml.sax.handler.ErrorHandler" title="xml.sax.handler.ErrorHandler"><code class="xref py py-class docutils literal"><span class="pre">ErrorHandler</span></code></a>实例;如果省略,将对所有错误引发<a class="reference internal" href="#xml.sax.SAXParseException" title="xml.sax.SAXParseException"><code class="xref py py-exc docutils literal"><span class="pre">SAXParseException</span></code></a></span><span class="yiyi-st" id="yiyi-28">没有返回值;所有工作必须由传递的<em>处理程序</em>完成。</span></p></dd></dl><dl class="function"><dt id="xml.sax.parseString"><span class="yiyi-st" id="yiyi-29"> <code class="descclassname">xml.sax.</code><code class="descname">parseString</code><span class="sig-paren">(</span><em>string</em>, <em>handler</em>, <em>error_handler=handler.ErrorHandler()</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-30">类似于<a class="reference internal" href="#xml.sax.parse" title="xml.sax.parse"><code class="xref py py-func docutils literal"><span class="pre">parse()</span></code></a>,但是从作为参数接收的缓冲区<em>字符串</em>解析。</span><span class="yiyi-st" id="yiyi-31"><em>string</em>必须是<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>实例或<a class="reference internal" href="../glossary.html#term-bytes-like-object"><span class="xref std std-term">bytes-like object</span></a></span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-32"><span class="versionmodified">在版本3.5中已更改:</span>添加了对<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>实例的支持。</span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-33">典型的SAX应用程序使用三种对象读取器处理程序和输入源。</span><span class="yiyi-st" id="yiyi-34">在本文中,“读者”是解析器的另一个术语,即</span><span class="yiyi-st" id="yiyi-35">从输入源读取字节或字符的一些代码,并且产生事件序列。</span><span class="yiyi-st" id="yiyi-36">然后事件被分配给处理程序对象,即</span><span class="yiyi-st" id="yiyi-37">读取器调用处理程序上的方法。</span><span class="yiyi-st" id="yiyi-38">因此SAX应用程序必须获取reader对象创建或打开输入源创建处理程序并将这些对象连接在一起。</span><span class="yiyi-st" id="yiyi-39">作为准备的最后一步,读者被调用来解析输入。</span><span class="yiyi-st" id="yiyi-40">在解析期间,基于来自输入数据的结构和句法事件来调用处理程序对象上的方法。</span></p><p><span class="yiyi-st" id="yiyi-41">对于这些对象,只有接口是相关的;它们通常不会由应用程序本身实例化。</span><span class="yiyi-st" id="yiyi-42">由于Python没有明确的接口概念它们被正式引入为类但应用程序可能使用不从提供的类继承的实现。</span><span class="yiyi-st" id="yiyi-43">定义<a class="reference internal" href="xml.sax.reader.html#xml.sax.xmlreader.InputSource" title="xml.sax.xmlreader.InputSource"><code class="xref py py-class docutils literal"><span class="pre">InputSource</span></code></a><a class="reference internal" href="xml.sax.reader.html#xml.sax.xmlreader.Locator" title="xml.sax.xmlreader.Locator"><code class="xref py py-class docutils literal"><span class="pre">Locator</span></code></a><code class="xref py py-class docutils literal"><span class="pre">Attributes</span></code><code class="xref py py-class docutils literal"><span class="pre">AttributesNS</span></code><a class="reference internal" href="xml.sax.reader.html#xml.sax.xmlreader.XMLReader" title="xml.sax.xmlreader.XMLReader"><code class="xref py py-class docutils literal"><span class="pre">XMLReader</span></code></a>模块<a class="reference internal" href="xml.sax.reader.html#module-xml.sax.xmlreader" title="xml.sax.xmlreader: Interface which SAX-compliant XML parsers must implement."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax.xmlreader</span></code></a></span><span class="yiyi-st" id="yiyi-44">处理程序接口在<a class="reference internal" href="xml.sax.handler.html#module-xml.sax.handler" title="xml.sax.handler: Base classes for SAX event handlers."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax.handler</span></code></a>中定义。</span><span class="yiyi-st" id="yiyi-45">为方便起见,<a class="reference internal" href="xml.sax.reader.html#xml.sax.xmlreader.InputSource" title="xml.sax.xmlreader.InputSource"><code class="xref py py-class docutils literal"><span class="pre">InputSource</span></code></a>(通常直接实例化)和处理程序类也可从<a class="reference internal" href="#module-xml.sax" title="xml.sax: Package containing SAX2 base classes and convenience functions."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax</span></code></a>获得。</span><span class="yiyi-st" id="yiyi-46">这些接口如下所述。</span></p><p><span class="yiyi-st" id="yiyi-47">除了这些类之外,<a class="reference internal" href="#module-xml.sax" title="xml.sax: Package containing SAX2 base classes and convenience functions."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax</span></code></a>还提供以下异常类。</span></p><dl class="exception"><dt id="xml.sax.SAXException"><span class="yiyi-st" id="yiyi-48"> <em class="property">exception </em><code class="descclassname">xml.sax.</code><code class="descname">SAXException</code><span class="sig-paren">(</span><em>msg</em>, <em>exception=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-49">封装XML错误或警告。</span><span class="yiyi-st" id="yiyi-50">此类可以包含来自XML解析器或应用程序的基本错误或警告信息可以将其子类化以提供其他功能或添加本地化。</span><span class="yiyi-st" id="yiyi-51">请注意,虽然<a class="reference internal" href="xml.sax.handler.html#xml.sax.handler.ErrorHandler" title="xml.sax.handler.ErrorHandler"><code class="xref py py-class docutils literal"><span class="pre">ErrorHandler</span></code></a>接口中定义的处理程序接收到此异常的实例,但不需要实际引发异常 - 它也可用作信息的容器。</span></p><p><span class="yiyi-st" id="yiyi-52">实例化时,<em>msg</em>应该是人为可读的错误描述。</span><span class="yiyi-st" id="yiyi-53">可选的<em>异常</em>参数(如果给出)应为<code class="docutils literal"><span class="pre">None</span></code>或者由解析代码捕获并作为信息传递的异常。</span></p><p><span class="yiyi-st" id="yiyi-54">这是其他SAX异常类的基类。</span></p></dd></dl><dl class="exception"><dt id="xml.sax.SAXParseException"><span class="yiyi-st" id="yiyi-55"> <em class="property">exception </em><code class="descclassname">xml.sax.</code><code class="descname">SAXParseException</code><span class="sig-paren">(</span><em>msg</em>, <em>exception</em>, <em>locator</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-56">在解析错误时引发的<a class="reference internal" href="#xml.sax.SAXException" title="xml.sax.SAXException"><code class="xref py py-exc docutils literal"><span class="pre">SAXException</span></code></a>子类。</span><span class="yiyi-st" id="yiyi-57">将此类的实例传递给SAX <a class="reference internal" href="xml.sax.handler.html#xml.sax.handler.ErrorHandler" title="xml.sax.handler.ErrorHandler"><code class="xref py py-class docutils literal"><span class="pre">ErrorHandler</span></code></a>接口的方法,以提供有关解析错误的信息。</span><span class="yiyi-st" id="yiyi-58">此类支持SAX <a class="reference internal" href="xml.sax.reader.html#xml.sax.xmlreader.Locator" title="xml.sax.xmlreader.Locator"><code class="xref py py-class docutils literal"><span class="pre">Locator</span></code></a>接口以及<a class="reference internal" href="#xml.sax.SAXException" title="xml.sax.SAXException"><code class="xref py py-class docutils literal"><span class="pre">SAXException</span></code></a>接口。</span></p></dd></dl><dl class="exception"><dt id="xml.sax.SAXNotRecognizedException"><span class="yiyi-st" id="yiyi-59"> <em class="property">exception </em><code class="descclassname">xml.sax.</code><code class="descname">SAXNotRecognizedException</code><span class="sig-paren">(</span><em>msg</em>, <em>exception=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-60">当SAX <a class="reference internal" href="xml.sax.reader.html#xml.sax.xmlreader.XMLReader" title="xml.sax.xmlreader.XMLReader"><code class="xref py py-class docutils literal"><span class="pre">XMLReader</span></code></a>遇到无法识别的要素或属性时引发的<a class="reference internal" href="#xml.sax.SAXException" title="xml.sax.SAXException"><code class="xref py py-exc docutils literal"><span class="pre">SAXException</span></code></a>子类。</span><span class="yiyi-st" id="yiyi-61">SAX应用程序和扩展可以使用此类用于类似的目的。</span></p></dd></dl><dl class="exception"><dt id="xml.sax.SAXNotSupportedException"><span class="yiyi-st" id="yiyi-62"> <em class="property">exception </em><code class="descclassname">xml.sax.</code><code class="descname">SAXNotSupportedException</code><span class="sig-paren">(</span><em>msg</em>, <em>exception=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-63">当要求SAX <a class="reference internal" href="xml.sax.reader.html#xml.sax.xmlreader.XMLReader" title="xml.sax.xmlreader.XMLReader"><code class="xref py py-class docutils literal"><span class="pre">XMLReader</span></code></a>启用不支持的功能时,或者将属性设置为实现不支持的值时,引发<a class="reference internal" href="#xml.sax.SAXException" title="xml.sax.SAXException"><code class="xref py py-exc docutils literal"><span class="pre">SAXException</span></code></a>的子类。</span><span class="yiyi-st" id="yiyi-64">SAX应用程序和扩展可以使用此类用于类似的目的。</span></p></dd></dl><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-65">也可以看看</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-66"><a class="reference external" href="http://www.saxproject.org/">SAXXML的简单API</a></span></dt><dd><span class="yiyi-st" id="yiyi-67">这个网站是SAX API定义的焦点。</span><span class="yiyi-st" id="yiyi-68">它提供了一个Java实现和在线文档。</span><span class="yiyi-st" id="yiyi-69">也提供实现和历史信息的链接。</span></dd><dt><span class="yiyi-st" id="yiyi-70">模块<a class="reference internal" href="xml.sax.handler.html#module-xml.sax.handler" title="xml.sax.handler: Base classes for SAX event handlers."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax.handler</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-71">应用程序提供对象的接口定义。</span></dd><dt><span class="yiyi-st" id="yiyi-72">模块<a class="reference internal" href="xml.sax.utils.html#module-xml.sax.saxutils" title="xml.sax.saxutils: Convenience functions and classes for use with SAX."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax.saxutils</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-73">用于SAX应用程序的便利功能。</span></dd><dt><span class="yiyi-st" id="yiyi-74">模块<a class="reference internal" href="xml.sax.reader.html#module-xml.sax.xmlreader" title="xml.sax.xmlreader: Interface which SAX-compliant XML parsers must implement."><code class="xref py py-mod docutils literal"><span class="pre">xml.sax.xmlreader</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-75">解析器提供的对象的接口定义。</span></dd></dl></div><div class="section" id="saxexception-objects"><h2><span class="yiyi-st" id="yiyi-76">20.9.1. </span><span class="yiyi-st" id="yiyi-77">SAXException Objects</span></h2><p><span class="yiyi-st" id="yiyi-78"><a class="reference internal" href="#xml.sax.SAXException" title="xml.sax.SAXException"><code class="xref py py-class docutils literal"><span class="pre">SAXException</span></code></a>异常类支持以下方法:</span></p><dl class="method"><dt id="xml.sax.SAXException.getMessage"><span class="yiyi-st" id="yiyi-79"> <code class="descclassname">SAXException.</code><code class="descname">getMessage</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-80">返回描述错误条件的人工可读消息。</span></p></dd></dl><dl class="method"><dt id="xml.sax.SAXException.getException"><span class="yiyi-st" id="yiyi-81"> <code class="descclassname">SAXException.</code><code class="descname">getException</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-82">返回封装的异常对象,或<code class="docutils literal"><span class="pre">None</span></code></span></p></dd></dl></div></div></div>