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

85 lines
33 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.minidom"><h1><span class="yiyi-st" id="yiyi-10">20.7. <a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</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/minidom.py">Lib / xml / dom / minidom.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>是文档对象模型接口的最小实现其API类似于其他语言。</span><span class="yiyi-st" id="yiyi-13">它的目的是比完整的DOM更简单也显着更小。</span><span class="yiyi-st" id="yiyi-14">尚未熟悉DOM的用户应考虑使用<a class="reference internal" href="xml.etree.elementtree.html#module-xml.etree.ElementTree" title="xml.etree.ElementTree: Implementation of the ElementTree API."><code class="xref py py-mod docutils literal"><span class="pre">xml.etree.ElementTree</span></code></a>模块进行XML处理。</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.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</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">DOM应用程序通常首先将一些XML解析为DOM。</span><span class="yiyi-st" id="yiyi-19">使用<a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>,这是通过解析函数完成的:</span></p><pre><code class="language-python"><span></span><span class="kn">from</span> <span class="nn">xml.dom.minidom</span> <span class="k">import</span> <span class="n">parse</span><span class="p">,</span> <span class="n">parseString</span>
<span class="n">dom1</span> <span class="o">=</span> <span class="n">parse</span><span class="p">(</span><span class="s1">'c:</span><span class="se">\\</span><span class="s1">temp</span><span class="se">\\</span><span class="s1">mydata.xml'</span><span class="p">)</span> <span class="c1"># parse an XML file by name</span>
<span class="n">datasource</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'c:</span><span class="se">\\</span><span class="s1">temp</span><span class="se">\\</span><span class="s1">mydata.xml'</span><span class="p">)</span>
<span class="n">dom2</span> <span class="o">=</span> <span class="n">parse</span><span class="p">(</span><span class="n">datasource</span><span class="p">)</span> <span class="c1"># parse an open file</span>
<span class="n">dom3</span> <span class="o">=</span> <span class="n">parseString</span><span class="p">(</span><span class="s1">'&lt;myxml&gt;Some data&lt;empty/&gt; some more data&lt;/myxml&gt;'</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-20"><a class="reference internal" href="#xml.dom.minidom.parse" title="xml.dom.minidom.parse"><code class="xref py py-func docutils literal"><span class="pre">parse()</span></code></a>函数可以采用文件名或打开的文件对象。</span></p><dl class="function"><dt id="xml.dom.minidom.parse"><span class="yiyi-st" id="yiyi-21"> <code class="descclassname">xml.dom.minidom.</code><code class="descname">parse</code><span class="sig-paren">(</span><em>filename_or_file</em>, <em>parser=None</em>, <em>bufsize=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-22">从给定输入返回<code class="xref py py-class docutils literal"><span class="pre">Document</span></code></span><span class="yiyi-st" id="yiyi-23"><em>filename_or_file</em> may be either a file name, or a file-like object.</span><span class="yiyi-st" id="yiyi-24"><em>解析器</em>如果给出必须是SAX2解析器对象。</span><span class="yiyi-st" id="yiyi-25">此函数将更改解析器的文档处理程序并激活命名空间支持;其他解析器配置(如设置实体解析器)必须提前完成。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-26">如果在字符串中有XML可以使用<a class="reference internal" href="#xml.dom.minidom.parseString" title="xml.dom.minidom.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.minidom.parseString"><span class="yiyi-st" id="yiyi-27"> <code class="descclassname">xml.dom.minidom.</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-28">返回表示<em>字符串</em><code class="xref py py-class docutils literal"><span class="pre">Document</span></code></span><span class="yiyi-st" id="yiyi-29">此方法为字符串创建<a class="reference internal" href="io.html#io.StringIO" title="io.StringIO"><code class="xref py py-class docutils literal"><span class="pre">io.StringIO</span></code></a>对象,并将其传递到<a class="reference internal" href="#xml.dom.minidom.parse" title="xml.dom.minidom.parse"><code class="xref py py-func docutils literal"><span class="pre">parse()</span></code></a></span></p></dd></dl><p><span class="yiyi-st" id="yiyi-30">这两个函数都返回一个表示文档内容的<code class="xref py py-class docutils literal"><span class="pre">Document</span></code>对象。</span></p><p><span class="yiyi-st" id="yiyi-31"><a class="reference internal" href="#xml.dom.minidom.parse" title="xml.dom.minidom.parse"><code class="xref py py-func docutils literal"><span class="pre">parse()</span></code></a><a class="reference internal" href="#xml.dom.minidom.parseString" title="xml.dom.minidom.parseString"><code class="xref py py-func docutils literal"><span class="pre">parseString()</span></code></a>函数做的是连接一个XML解析器和一个“DOM构建器”它可以接受来自任何SAX解析器的解析事件 DOM树。</span><span class="yiyi-st" id="yiyi-32">函数的名称可能是误导,但在学习界面时容易掌握。</span><span class="yiyi-st" id="yiyi-33">在这些函数返回之前,将完成文档的解析;只是这些函数不提供解析器实现本身。</span></p><p><span class="yiyi-st" id="yiyi-34">您还可以通过调用“DOM实现”对象上的方法来创建<code class="xref py py-class docutils literal"><span class="pre">Document</span></code></span><span class="yiyi-st" id="yiyi-35">您可以通过调用<a class="reference internal" href="xml.dom.html#module-xml.dom" title="xml.dom: Document Object Model API for Python."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom</span></code></a>包或<a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>模块中的<code class="xref py py-func docutils literal"><span class="pre">getDOMImplementation()</span></code>函数来获取此对象。</span><span class="yiyi-st" id="yiyi-36">一旦您有<code class="xref py py-class docutils literal"><span class="pre">Document</span></code>就可以向其中添加子节点来填充DOM</span></p><pre><code class="language-python"><span></span><span class="kn">from</span> <span class="nn">xml.dom.minidom</span> <span class="k">import</span> <span class="n">getDOMImplementation</span>
<span class="n">impl</span> <span class="o">=</span> <span class="n">getDOMImplementation</span><span class="p">()</span>
<span class="n">newdoc</span> <span class="o">=</span> <span class="n">impl</span><span class="o">.</span><span class="n">createDocument</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="s2">"some_tag"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">top_element</span> <span class="o">=</span> <span class="n">newdoc</span><span class="o">.</span><span class="n">documentElement</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">newdoc</span><span class="o">.</span><span class="n">createTextNode</span><span class="p">(</span><span class="s1">'Some textual content.'</span><span class="p">)</span>
<span class="n">top_element</span><span class="o">.</span><span class="n">appendChild</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-37">一旦有了DOM文档对象就可以通过它的属性和方法访问XML文档的部分。</span><span class="yiyi-st" id="yiyi-38">这些属性在DOM规范中定义。</span><span class="yiyi-st" id="yiyi-39">文档对象的主要属性是<code class="xref py py-attr docutils literal"><span class="pre">documentElement</span></code>属性。</span><span class="yiyi-st" id="yiyi-40">它为您提供了XML文档中的主要元素包含所有其他元素的元素。</span><span class="yiyi-st" id="yiyi-41">这里是一个示例程序:</span></p><pre><code class="language-python"><span></span><span class="n">dom3</span> <span class="o">=</span> <span class="n">parseString</span><span class="p">(</span><span class="s2">"&lt;myxml&gt;Some data&lt;/myxml&gt;"</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">dom3</span><span class="o">.</span><span class="n">documentElement</span><span class="o">.</span><span class="n">tagName</span> <span class="o">==</span> <span class="s2">"myxml"</span>
</code></pre><p><span class="yiyi-st" id="yiyi-42">当您完成DOM树时您可以选择调用<code class="xref py py-meth docutils literal"><span class="pre">unlink()</span></code>方法,以鼓励及早清理现在不需要的对象。</span><span class="yiyi-st" id="yiyi-43"><code class="xref py py-meth docutils literal"><span class="pre">unlink()</span></code>是一个<a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>特定的DOM API扩展它显示节点及其后代本质上是无用的。</span><span class="yiyi-st" id="yiyi-44">否则Python的垃圾收集器最终会处理树中的对象。</span></p><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-45">也可以看看</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-46"><a class="reference external" href="https://www.w3.org/TR/REC-DOM-Level-1/">文档对象模型DOM1级规范</a></span></dt><dd><span class="yiyi-st" id="yiyi-47">W3C对<a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>支持的DOM的建议。</span></dd></dl></div><div class="section" id="dom-objects"><h2><span class="yiyi-st" id="yiyi-48">20.7.1. </span><span class="yiyi-st" id="yiyi-49">DOM Objects</span></h2><p><span class="yiyi-st" id="yiyi-50">Python的DOM API的定义作为<a class="reference internal" href="xml.dom.html#module-xml.dom" title="xml.dom: Document Object Model API for Python."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom</span></code></a>模块文档的一部分提供。</span><span class="yiyi-st" id="yiyi-51">本节列出API与<a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>之间的差异。</span></p><dl class="method"><dt id="xml.dom.minidom.Node.unlink"><span class="yiyi-st" id="yiyi-52"> <code class="descclassname">Node.</code><code class="descname">unlink</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-53">打破DOM中的内部引用以便在没有循环GC的Python版本上进行垃圾回收。</span><span class="yiyi-st" id="yiyi-54">即使循环GC可用使用它可以更快地使大量内存可用因此一旦DOM对象不再需要就调用它是一个好习惯。</span><span class="yiyi-st" id="yiyi-55">这只需要在<code class="xref py py-class docutils literal"><span class="pre">Document</span></code>对象上调用,但可以在子节点上调用以丢弃该节点的子代。</span></p><p><span class="yiyi-st" id="yiyi-56">您可以通过使用<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>语句来避免显式调用此方法。</span><span class="yiyi-st" id="yiyi-57">当退出<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>块时,以下代码将自动取消链接<em>dom</em></span></p><pre><code class="language-python"><span></span><span class="k">with</span> <span class="n">xml</span><span class="o">.</span><span class="n">dom</span><span class="o">.</span><span class="n">minidom</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">datasource</span><span class="p">)</span> <span class="k">as</span> <span class="n">dom</span><span class="p">:</span>
<span class="o">...</span> <span class="c1"># Work with dom.</span>
</code></pre></dd></dl><dl class="method"><dt id="xml.dom.minidom.Node.writexml"><span class="yiyi-st" id="yiyi-58"> <code class="descclassname">Node.</code><code class="descname">writexml</code><span class="sig-paren">(</span><em>writer</em>, <em>indent=""</em>, <em>addindent=""</em>, <em>newl=""</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-59">将XML写入writer对象。</span><span class="yiyi-st" id="yiyi-60">写入程序应该有一个与文件对象接口匹配的<code class="xref py py-meth docutils literal"><span class="pre">write()</span></code>方法。</span><span class="yiyi-st" id="yiyi-61"><em>缩进</em>参数是当前节点的缩进。</span><span class="yiyi-st" id="yiyi-62"><em>addindent</em>参数是用于当前子节点的增量缩进。</span><span class="yiyi-st" id="yiyi-63"><em>newl</em>参数指定用于终止换行符的字符串。</span></p><p><span class="yiyi-st" id="yiyi-64">对于<code class="xref py py-class docutils literal"><span class="pre">Document</span></code>节点,可以使用附加的关键字参数<em>encoding</em>来指定XML标头的编码字段。</span></p></dd></dl><dl class="method"><dt id="xml.dom.minidom.Node.toxml"><span class="yiyi-st" id="yiyi-65"> <code class="descclassname">Node.</code><code class="descname">toxml</code><span class="sig-paren">(</span><em>encoding=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-66">返回一个包含由DOM节点表示的XML的字符串或字节字符串。</span></p><p><span class="yiyi-st" id="yiyi-67">使用显式的<em>编码</em> <a class="footnote-reference" href="#id3" id="id1">[1]</a>参数,结果是指定编码中的字节字符串。</span><span class="yiyi-st" id="yiyi-68">如果没有<em>encoding</em>参数则结果是Unicode字符串并且生成的字符串中的XML声明不指定编码。</span><span class="yiyi-st" id="yiyi-69">使用UTF-8之外的编码对此字符串进行编码可能不正确因为UTF-8是XML的默认编码。</span></p></dd></dl><dl class="method"><dt id="xml.dom.minidom.Node.toprettyxml"><span class="yiyi-st" id="yiyi-70"> <code class="descclassname">Node.</code><code class="descname">toprettyxml</code><span class="sig-paren">(</span><em>indent=""</em>, <em>newl=""</em>, <em>encoding=""</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-71">返回文档的漂亮打印版本。</span><span class="yiyi-st" id="yiyi-72"><em>缩进</em>指定缩进字符串,默认为制表符; <em>newl</em>指定每行结尾处发出的字符串,默认为<code class="docutils literal"><span class="pre">\n</span></code></span></p><p><span class="yiyi-st" id="yiyi-73"><em>encoding</em>参数的行为类似于<a class="reference internal" href="#xml.dom.minidom.Node.toxml" title="xml.dom.minidom.Node.toxml"><code class="xref py py-meth docutils literal"><span class="pre">toxml()</span></code></a>的相应参数。</span></p></dd></dl></div><div class="section" id="dom-example"><h2><span class="yiyi-st" id="yiyi-74">20.7.2. </span><span class="yiyi-st" id="yiyi-75">DOM Example</span></h2><p><span class="yiyi-st" id="yiyi-76">这个例子程序是一个简单程序的一个相当现实的例子。</span><span class="yiyi-st" id="yiyi-77">在这种特殊情况下我们没有利用DOM的灵活性。</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">xml.dom.minidom</span>
<span class="n">document</span> <span class="o">=</span> <span class="s2">"""</span><span class="se">\</span>
<span class="s2">&lt;slideshow&gt;</span>
<span class="s2">&lt;title&gt;Demo slideshow&lt;/title&gt;</span>
<span class="s2">&lt;slide&gt;&lt;title&gt;Slide title&lt;/title&gt;</span>
<span class="s2">&lt;point&gt;This is a demo&lt;/point&gt;</span>
<span class="s2">&lt;point&gt;Of a program for processing slides&lt;/point&gt;</span>
<span class="s2">&lt;/slide&gt;</span>
<span class="s2">&lt;slide&gt;&lt;title&gt;Another demo slide&lt;/title&gt;</span>
<span class="s2">&lt;point&gt;It is important&lt;/point&gt;</span>
<span class="s2">&lt;point&gt;To have more than&lt;/point&gt;</span>
<span class="s2">&lt;point&gt;one slide&lt;/point&gt;</span>
<span class="s2">&lt;/slide&gt;</span>
<span class="s2">&lt;/slideshow&gt;</span>
<span class="s2">"""</span>
<span class="n">dom</span> <span class="o">=</span> <span class="n">xml</span><span class="o">.</span><span class="n">dom</span><span class="o">.</span><span class="n">minidom</span><span class="o">.</span><span class="n">parseString</span><span class="p">(</span><span class="n">document</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">getText</span><span class="p">(</span><span class="n">nodelist</span><span class="p">):</span>
<span class="n">rc</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">nodelist</span><span class="p">:</span>
<span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">nodeType</span> <span class="o">==</span> <span class="n">node</span><span class="o">.</span><span class="n">TEXT_NODE</span><span class="p">:</span>
<span class="n">rc</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
<span class="k">return</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">rc</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">handleSlideshow</span><span class="p">(</span><span class="n">slideshow</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"&lt;html&gt;"</span><span class="p">)</span>
<span class="n">handleSlideshowTitle</span><span class="p">(</span><span class="n">slideshow</span><span class="o">.</span><span class="n">getElementsByTagName</span><span class="p">(</span><span class="s2">"title"</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">slides</span> <span class="o">=</span> <span class="n">slideshow</span><span class="o">.</span><span class="n">getElementsByTagName</span><span class="p">(</span><span class="s2">"slide"</span><span class="p">)</span>
<span class="n">handleToc</span><span class="p">(</span><span class="n">slides</span><span class="p">)</span>
<span class="n">handleSlides</span><span class="p">(</span><span class="n">slides</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"&lt;/html&gt;"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">handleSlides</span><span class="p">(</span><span class="n">slides</span><span class="p">):</span>
<span class="k">for</span> <span class="n">slide</span> <span class="ow">in</span> <span class="n">slides</span><span class="p">:</span>
<span class="n">handleSlide</span><span class="p">(</span><span class="n">slide</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">handleSlide</span><span class="p">(</span><span class="n">slide</span><span class="p">):</span>
<span class="n">handleSlideTitle</span><span class="p">(</span><span class="n">slide</span><span class="o">.</span><span class="n">getElementsByTagName</span><span class="p">(</span><span class="s2">"title"</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">handlePoints</span><span class="p">(</span><span class="n">slide</span><span class="o">.</span><span class="n">getElementsByTagName</span><span class="p">(</span><span class="s2">"point"</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">handleSlideshowTitle</span><span class="p">(</span><span class="n">title</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"&lt;title&gt;</span><span class="si">%s</span><span class="s2">&lt;/title&gt;"</span> <span class="o">%</span> <span class="n">getText</span><span class="p">(</span><span class="n">title</span><span class="o">.</span><span class="n">childNodes</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">handleSlideTitle</span><span class="p">(</span><span class="n">title</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"&lt;h2&gt;</span><span class="si">%s</span><span class="s2">&lt;/h2&gt;"</span> <span class="o">%</span> <span class="n">getText</span><span class="p">(</span><span class="n">title</span><span class="o">.</span><span class="n">childNodes</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">handlePoints</span><span class="p">(</span><span class="n">points</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"&lt;ul&gt;"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">point</span> <span class="ow">in</span> <span class="n">points</span><span class="p">:</span>
<span class="n">handlePoint</span><span class="p">(</span><span class="n">point</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"&lt;/ul&gt;"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">handlePoint</span><span class="p">(</span><span class="n">point</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"&lt;li&gt;</span><span class="si">%s</span><span class="s2">&lt;/li&gt;"</span> <span class="o">%</span> <span class="n">getText</span><span class="p">(</span><span class="n">point</span><span class="o">.</span><span class="n">childNodes</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">handleToc</span><span class="p">(</span><span class="n">slides</span><span class="p">):</span>
<span class="k">for</span> <span class="n">slide</span> <span class="ow">in</span> <span class="n">slides</span><span class="p">:</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">slide</span><span class="o">.</span><span class="n">getElementsByTagName</span><span class="p">(</span><span class="s2">"title"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"&lt;p&gt;</span><span class="si">%s</span><span class="s2">&lt;/p&gt;"</span> <span class="o">%</span> <span class="n">getText</span><span class="p">(</span><span class="n">title</span><span class="o">.</span><span class="n">childNodes</span><span class="p">))</span>
<span class="n">handleSlideshow</span><span class="p">(</span><span class="n">dom</span><span class="p">)</span>
</code></pre></div><div class="section" id="minidom-and-the-dom-standard"><h2><span class="yiyi-st" id="yiyi-78">20.7.3. minidom和DOM标准</span></h2><p><span class="yiyi-st" id="yiyi-79"><a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>模块本质上是一个DOM 1.0兼容的DOM具有一些DOM 2功能主要是命名空间功能</span></p><p><span class="yiyi-st" id="yiyi-80">在Python中使用DOM接口是直接的。</span><span class="yiyi-st" id="yiyi-81">以下映射规则适用:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-82">接口通过实例对象访问。</span><span class="yiyi-st" id="yiyi-83">应用程序不应该实例化类本身;则应使用<code class="xref py py-class docutils literal"><span class="pre">Document</span></code>对象上提供的创建者函数。</span><span class="yiyi-st" id="yiyi-84">派生接口支持来自基本接口的所有操作(和属性),以及任何新操作。</span></li><li><span class="yiyi-st" id="yiyi-85">操作用作方法。</span><span class="yiyi-st" id="yiyi-86">由于DOM在参数中仅使用<a class="reference internal" href="../reference/expressions.html#in"><code class="xref std std-keyword docutils literal"><span class="pre">in</span></code></a></span><span class="yiyi-st" id="yiyi-87">没有可选参数。</span><span class="yiyi-st" id="yiyi-88"><code class="docutils literal"><span class="pre">void</span></code>操作返回<code class="docutils literal"><span class="pre">None</span></code></span></li><li><span class="yiyi-st" id="yiyi-89">IDL属性映射到实例属性。</span><span class="yiyi-st" id="yiyi-90">为了与Python的OMG IDL语言映射兼容还可以通过访问器方法<code class="xref py py-meth docutils literal"><span class="pre">_get_foo()</span></code><code class="xref py py-meth docutils literal"><span class="pre">_set_foo()</span></code>访问属性<code class="docutils literal"><span class="pre">foo</span></code></span><span class="yiyi-st" id="yiyi-91"><code class="docutils literal"><span class="pre">readonly</span></code>属性不能更改;这不是在运行时强制。</span></li><li><span class="yiyi-st" id="yiyi-92">类型<code class="docutils literal"><span class="pre"></span> <span class="pre">int</span></code><code class="docutils literal"><span class="pre">无符号</span> <span class="pre">int</span> <code class="docutils literal"><span class="pre">unsigned</span> <span class="pre">long</span> <span class="pre">long</span></code><code class="docutils literal"><span class="pre">boolean</span></code></code></span></li><li><span class="yiyi-st" id="yiyi-93">类型<code class="docutils literal"><span class="pre">DOMString</span></code>射到Python字符串。</span><span class="yiyi-st" id="yiyi-94"><a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>支持字节或字符串,但通常会产生字符串。</span><span class="yiyi-st" id="yiyi-95">类型<code class="docutils literal"><span class="pre">DOMString</span></code>的值也可以是<code class="docutils literal"><span class="pre">None</span></code>其中允许具有来自W3C的DOM规范的IDL <code class="docutils literal"><span class="pre">null</span></code>值。</span></li><li><span class="yiyi-st" id="yiyi-96"><code class="docutils literal"><span class="pre">const</span></code>声明映射到它们各自范围内的变量。</span><span class="yiyi-st" id="yiyi-97"><code class="docutils literal"><span class="pre">xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE</span></code>);它们不能改变。</span></li><li><span class="yiyi-st" id="yiyi-98"><a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>中目前不支持<code class="docutils literal"><span class="pre">DOMException</span></code></span><span class="yiyi-st" id="yiyi-99">而是,<a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>使用标准Python异常例如<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a><a class="reference internal" href="exceptions.html#AttributeError" title="AttributeError"><code class="xref py py-exc docutils literal"><span class="pre">AttributeError</span></code></a></span></li><li><span class="yiyi-st" id="yiyi-100"><code class="xref py py-class docutils literal"><span class="pre">NodeList</span></code>对象使用Python的内建列表类型实现。</span><span class="yiyi-st" id="yiyi-101">这些对象提供了在DOM规范中定义的接口但是对于早期版本的Python它们不支持官方API。</span><span class="yiyi-st" id="yiyi-102">然而它们比W3C建议中定义的接口更加“Pythonic”。</span></li></ul><p><span class="yiyi-st" id="yiyi-103">以下接口在<a class="reference internal" href="#module-xml.dom.minidom" title="xml.dom.minidom: Minimal Document Object Model (DOM) implementation."><code class="xref py py-mod docutils literal"><span class="pre">xml.dom.minidom</span></code></a>中没有实现:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-104"><code class="xref py py-class docutils literal"><span class="pre">DOMTimeStamp</span></code></span></li><li><span class="yiyi-st" id="yiyi-105"><code class="xref py py-class docutils literal"><span class="pre">DocumentType</span></code></span></li><li><span class="yiyi-st" id="yiyi-106"><code class="xref py py-class docutils literal"><span class="pre">DOMImplementation</span></code></span></li><li><span class="yiyi-st" id="yiyi-107"><code class="xref py py-class docutils literal"><span class="pre">CharacterData</span></code></span></li><li><span class="yiyi-st" id="yiyi-108"><code class="xref py py-class docutils literal"><span class="pre">CDATASection</span></code></span></li><li><span class="yiyi-st" id="yiyi-109"><code class="xref py py-class docutils literal"><span class="pre">Notation</span></code></span></li><li><span class="yiyi-st" id="yiyi-110"><code class="xref py py-class docutils literal"><span class="pre">Entity</span></code></span></li><li><span class="yiyi-st" id="yiyi-111"><code class="xref py py-class docutils literal"><span class="pre">EntityReference</span></code></span></li><li><span class="yiyi-st" id="yiyi-112"><code class="xref py py-class docutils literal"><span class="pre">DocumentFragment</span></code></span></li></ul><p><span class="yiyi-st" id="yiyi-113">大多数这些都反映在XML文档中的信息这对大多数DOM用户来说不是通用的。</span></p><p class="rubric"><span class="yiyi-st" id="yiyi-114">脚注</span></p><table class="docutils footnote" frame="void" id="id3" rules="none"><tbody valign="top"><tr><td class="label"><span class="yiyi-st" id="yiyi-115">[1]</span></td><td><span class="yiyi-st" id="yiyi-116">XML输出中包含的编码名称应符合相应的标准。</span><span class="yiyi-st" id="yiyi-117">例如“UTF-8”有效但“UTF8”在XML文档的声明中无效即使Python接受它作为编码名称。</span><span class="yiyi-st" id="yiyi-118">请参阅<a class="reference external" href="https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl">https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl</a><a class="reference external" href="https://www.iana.org/assignments/character-sets/character-sets.xhtml">https://www.iana.org/assignments/character- sets / character-sets.xhtml</a></span></td></tr></tbody></table></div></div></div>