mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
20 lines
15 KiB
HTML
20 lines
15 KiB
HTML
<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">></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">'<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'</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 '<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>
|
||
<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 '<p>Some text <div>and more</div></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></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> |