mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
85 lines
33 KiB
HTML
85 lines
33 KiB
HTML
<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">'<myxml>Some data<empty/> some more data</myxml>'</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">"<myxml>Some data</myxml>"</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/">文档对象模型(DOM)1级规范</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"><slideshow></span>
|
||
<span class="s2"><title>Demo slideshow</title></span>
|
||
<span class="s2"><slide><title>Slide title</title></span>
|
||
<span class="s2"><point>This is a demo</point></span>
|
||
<span class="s2"><point>Of a program for processing slides</point></span>
|
||
<span class="s2"></slide></span>
|
||
|
||
<span class="s2"><slide><title>Another demo slide</title></span>
|
||
<span class="s2"><point>It is important</point></span>
|
||
<span class="s2"><point>To have more than</point></span>
|
||
<span class="s2"><point>one slide</point></span>
|
||
<span class="s2"></slide></span>
|
||
<span class="s2"></slideshow></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">"<html>"</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">"</html>"</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">"<title></span><span class="si">%s</span><span class="s2"></title>"</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">"<h2></span><span class="si">%s</span><span class="s2"></h2>"</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">"<ul>"</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">"</ul>"</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">"<li></span><span class="si">%s</span><span class="s2"></li>"</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">"<p></span><span class="si">%s</span><span class="s2"></p>"</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> |