uTools-Manuals/docs/python/xml.dom.pulldom.html
2019-04-21 11:50:48 +08:00

20 lines
15 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.dom.pulldom"><h1><span class="yiyi-st" id="yiyi-10">20.8. <a class="reference internal" href="#module-xml.dom.pulldom" title="xml.dom.pulldom: Support for building partial DOM trees from SAX events."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.pulldom</span></code></a> - 支持构建部分DOM树</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/dom/pulldom.py">Lib / xml / dom / pulldom.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-xml.dom.pulldom" title="xml.dom.pulldom: Support for building partial DOM trees from SAX events."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.pulldom</span></code></a>模块提供了一个“pull解析器”如果需要也可以要求它生成文档的DOM可访问的片段。</span><span class="yiyi-st" id="yiyi-13">基本概念涉及从传入XML流中拉出“事件”并处理它们。</span><span class="yiyi-st" id="yiyi-14">与还使用事件驱动处理模型和回调的SAX相反拉解析器的用户负责从流中显式拉出事件循环这些事件直到处理完成或出现错误条件。</span></p><div class="admonition warning"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-15">警告</span></p><p class="last"><span class="yiyi-st" id="yiyi-16"><a class="reference internal" href="#module-xml.dom.pulldom" title="xml.dom.pulldom: Support for building partial DOM trees from SAX events."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.pulldom</span></code></a>模块对于恶意构建的数据不安全。</span><span class="yiyi-st" id="yiyi-17">如果需要解析不受信任或未经身份验证的数据,请参阅<a class="reference internal" href="xml.html#xml-vulnerabilities"><span>XML vulnerabilities</span></a></span></p></div><p><span class="yiyi-st" id="yiyi-18">例:</span></p><pre><code class="language-python"><span></span><span class="kn">from</span> <span class="nn">xml.dom</span> <span class="k">import</span> <span class="n">pulldom</span>
<span class="n">doc</span> <span class="o">=</span> <span class="n">pulldom</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="s1">'sales_items.xml'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">event</span><span class="p">,</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">doc</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span> <span class="o">==</span> <span class="n">pulldom</span><span class="o">.</span><span class="n">START_ELEMENT</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">tagName</span> <span class="o">==</span> <span class="s1">'item'</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">getAttribute</span><span class="p">(</span><span class="s1">'price'</span><span class="p">))</span> <span class="o">&gt;</span> <span class="mi">50</span><span class="p">:</span>
<span class="n">doc</span><span class="o">.</span><span class="n">expandNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">toxml</span><span class="p">())</span>
</code></pre><p><span class="yiyi-st" id="yiyi-19"><code class="docutils literal"><span class="pre">event</span></code>是常数,可以是以下之一:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-20"><code class="xref py py-data docutils literal"><span class="pre">START_ELEMENT</span></code></span></li><li><span class="yiyi-st" id="yiyi-21"><code class="xref py py-data docutils literal"><span class="pre">END_ELEMENT</span></code></span></li><li><span class="yiyi-st" id="yiyi-22"><code class="xref py py-data docutils literal"><span class="pre">COMMENT</span></code></span></li><li><span class="yiyi-st" id="yiyi-23"><code class="xref py py-data docutils literal"><span class="pre">START_DOCUMENT</span></code></span></li><li><span class="yiyi-st" id="yiyi-24"><code class="xref py py-data docutils literal"><span class="pre">END_DOCUMENT</span></code></span></li><li><span class="yiyi-st" id="yiyi-25"><code class="xref py py-data docutils literal"><span class="pre">CHARACTERS</span></code></span></li><li><span class="yiyi-st" id="yiyi-26"><code class="xref py py-data docutils literal"><span class="pre">PROCESSING_INSTRUCTION</span></code></span></li><li><span class="yiyi-st" id="yiyi-27"><code class="xref py py-data docutils literal"><span class="pre">IGNORABLE_WHITESPACE</span></code></span></li></ul><p><span class="yiyi-st" id="yiyi-28"><code class="docutils literal"><span class="pre">node</span></code>是类型<code class="xref py py-class docutils literal"><span class="pre">xml.dom.minidom.Document</span></code><code class="xref py py-class docutils literal"><span class="pre">xml.dom.minidom.Element</span></code><code class="xref py py-class docutils literal"><span class="pre">xml.dom.minidom.Text</span></code></span></p><p><span class="yiyi-st" id="yiyi-29">由于文档被视为“平坦”事件流,所以隐含地遍历文档“树”,并且找到期望的元素,而不管它们在树中的深度如何。</span><span class="yiyi-st" id="yiyi-30">换句话说,人们不需要考虑诸如文档节点的递归搜索的分级问题,但是如果元素的上下文是重要的,则需要维持一些上下文相关状态(即,</span><span class="yiyi-st" id="yiyi-31">记住在任何给定点处文档中的哪个位置),或者使用<a class="reference internal" href="#xml.dom.pulldom.DOMEventStream.expandNode" title="xml.dom.pulldom.DOMEventStream.expandNode"><code class="xref py py-func docutils literal"><span class="pre">DOMEventStream.expandNode()</span></code></a>方法并切换到DOM相关处理。</span></p><dl class="class"><dt id="xml.dom.pulldom.PullDom"><span class="yiyi-st" id="yiyi-32"> <em class="property">class </em><code class="descclassname">xml.dom.pulldom.</code><code class="descname">PullDom</code><span class="sig-paren">(</span><em>documentFactory=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-33"><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">xml.sax.handler.ContentHandler</span></code></a>的子类。</span></p></dd></dl><dl class="class"><dt id="xml.dom.pulldom.SAX2DOM"><span class="yiyi-st" id="yiyi-34"> <em class="property">class </em><code class="descclassname">xml.dom.pulldom.</code><code class="descname">SAX2DOM</code><span class="sig-paren">(</span><em>documentFactory=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-35"><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">xml.sax.handler.ContentHandler</span></code></a>的子类。</span></p></dd></dl><dl class="function"><dt id="xml.dom.pulldom.parse"><span class="yiyi-st" id="yiyi-36"> <code class="descclassname">xml.dom.pulldom.</code><code class="descname">parse</code><span class="sig-paren">(</span><em>stream_or_string</em>, <em>parser=None</em>, <em>bufsize=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-37">从给定输入返回<a class="reference internal" href="#xml.dom.pulldom.DOMEventStream" title="xml.dom.pulldom.DOMEventStream"><code class="xref py py-class docutils literal"><span class="pre">DOMEventStream</span></code></a></span><span class="yiyi-st" id="yiyi-38"><em>stream_or_string</em>可以是文件名或类似文件的对象。</span><span class="yiyi-st" id="yiyi-39"><em>解析器</em>(如果给定)必须是<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-40">此函数将更改解析器的文档处理程序并激活命名空间支持;其他解析器配置(如设置实体解析器)必须提前完成。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-41">如果在字符串中有XML可以使用<a class="reference internal" href="#xml.dom.pulldom.parseString" title="xml.dom.pulldom.parseString"><code class="xref py py-func docutils literal"><span class="pre">parseString()</span></code></a>函数:</span></p><dl class="function"><dt id="xml.dom.pulldom.parseString"><span class="yiyi-st" id="yiyi-42"> <code class="descclassname">xml.dom.pulldom.</code><code class="descname">parseString</code><span class="sig-paren">(</span><em>string</em>, <em>parser=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-43">返回表示Unicode<em>字符串</em><a class="reference internal" href="#xml.dom.pulldom.DOMEventStream" title="xml.dom.pulldom.DOMEventStream"><code class="xref py py-class docutils literal"><span class="pre">DOMEventStream</span></code></a></span></p></dd></dl><dl class="data"><dt id="xml.dom.pulldom.default_bufsize"><span class="yiyi-st" id="yiyi-44"> <code class="descclassname">xml.dom.pulldom.</code><code class="descname">default_bufsize</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-45"><em>bufsize</em>参数到<a class="reference internal" href="#xml.dom.pulldom.parse" title="xml.dom.pulldom.parse"><code class="xref py py-func docutils literal"><span class="pre">parse()</span></code></a>的默认值。</span></p><p><span class="yiyi-st" id="yiyi-46">在调用<a class="reference internal" href="#xml.dom.pulldom.parse" title="xml.dom.pulldom.parse"><code class="xref py py-func docutils literal"><span class="pre">parse()</span></code></a>之前,可以更改此变量的值,新值将生效。</span></p></dd></dl><div class="section" id="domeventstream-objects"><h2><span class="yiyi-st" id="yiyi-47">20.8.1. </span><span class="yiyi-st" id="yiyi-48">DOMEventStream Objects</span></h2><dl class="class"><dt id="xml.dom.pulldom.DOMEventStream"><span class="yiyi-st" id="yiyi-49"> <em class="property">class </em><code class="descclassname">xml.dom.pulldom.</code><code class="descname">DOMEventStream</code><span class="sig-paren">(</span><em>stream</em>, <em>parser</em>, <em>bufsize</em><span class="sig-paren">)</span></span></dt><dd><dl class="method"><dt id="xml.dom.pulldom.DOMEventStream.getEvent"><span class="yiyi-st" id="yiyi-50"> <code class="descname">getEvent</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-51">如果event等于<code class="xref py py-data docutils literal"><span class="pre">START_DOCUMENT</span></code>,则返回包含<em>事件</em>和当前<em>节点</em>的元组为<code class="xref py py-class docutils literal"><span class="pre">xml.dom.minidom.Document</span></code> <code class="xref py py-class docutils literal"><span class="pre">xml.dom.minidom.Element</span></code> if event equals <code class="xref py py-data docutils literal"><span class="pre">START_ELEMENT</span></code><code class="xref py py-data docutils literal"><span class="pre">END_ELEMENT</span></code><code class="xref py py-class docutils literal"><span class="pre">xml.dom.minidom.Text</span></code> if事件等于<code class="xref py py-data docutils literal"><span class="pre">CHARACTERS</span></code></span><span class="yiyi-st" id="yiyi-52">除非调用<a class="reference internal" href="#xml.dom.pulldom.DOMEventStream.expandNode" title="xml.dom.pulldom.DOMEventStream.expandNode"><code class="xref py py-func docutils literal"><span class="pre">expandNode()</span></code></a>,否则当前节点不包含有关其子节点的信息。</span></p></dd></dl><dl class="method"><dt id="xml.dom.pulldom.DOMEventStream.expandNode"><span class="yiyi-st" id="yiyi-53"> <code class="descname">expandNode</code><span class="sig-paren">(</span><em>node</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-54"><em>节点</em>的所有子节点扩展为<em>节点</em></span><span class="yiyi-st" id="yiyi-55">例:</span></p><pre><code class="language-python"><span></span><span class="kn">from</span> <span class="nn">xml.dom</span> <span class="k">import</span> <span class="n">pulldom</span>
<span class="n">xml</span> <span class="o">=</span> <span class="s1">'&lt;html&gt;&lt;title&gt;Foo&lt;/title&gt; &lt;p&gt;Some text &lt;div&gt;and more&lt;/div&gt;&lt;/p&gt; &lt;/html&gt;'</span>
<span class="n">doc</span> <span class="o">=</span> <span class="n">pulldom</span><span class="o">.</span><span class="n">parseString</span><span class="p">(</span><span class="n">xml</span><span class="p">)</span>
<span class="k">for</span> <span class="n">event</span><span class="p">,</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">doc</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span> <span class="o">==</span> <span class="n">pulldom</span><span class="o">.</span><span class="n">START_ELEMENT</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">tagName</span> <span class="o">==</span> <span class="s1">'p'</span><span class="p">:</span>
<span class="c1"># Following statement only prints '&lt;p/&gt;'</span>
<span class="nb">print</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">toxml</span><span class="p">())</span>
<span class="n">doc</span><span class="o">.</span><span class="n">expandNode</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
<span class="c1"># Following statement prints node with all its children '&lt;p&gt;Some text &lt;div&gt;and more&lt;/div&gt;&lt;/p&gt;'</span>
<span class="nb">print</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">toxml</span><span class="p">())</span>
</code></pre></dd></dl><dl class="method"><dt id="xml.dom.pulldom.DOMEventStream.reset"><span class="yiyi-st" id="yiyi-56"> <code class="descname">reset</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd></dd></dl></dd></dl></div></div></div>