【问题标题】:Minimual DOM - set an attribute on the root nodeMinimal DOM - 在根节点上设置一个属性
【发布时间】:2018-09-28 02:23:03
【问题描述】:

Minimal DOM (minidom) 不允许在根元素上设置属性。

这是我的代码:

    # -*- coding: utf-8 -*- 

    from xml.dom import minidom
    import os

    root = minidom.Document()

    xml = root.createElement('dbtable')
    root.setAttribute("name", 'states')
    root.appendChild(xml)

这是错误:

Traceback (most recent call last):
  File "C:\Users\sbing\.qgis2\python\plugins\SaveAttributesXML\createXML01.py", line 11, in <module>
    root.setAttribute( "id", 'myIdvalue' )
AttributeError: Document instance has no attribute 'setAttribute'

【问题讨论】:

    标签: python xml plugins qgis minidom


    【解决方案1】:

    您正在尝试为文档本身设置属性,而不是根元素。

    当您调用Document() 时,您只需创建有关处理文档所需声明的信息。它绝不会创建根元素:也许使用代码您会更好地理解:

    >>> from xml.dom import minidom
    >>> xmldoc = minidom.Document()
    >>> xmldoc.toxml()
    '<?xml version="1.0" ?>'
    >>> xmldoc.childNodes
    []
    

    这段代码告诉我们什么?它只是说当您调用 Document() 时,您基本上是创建 XML 序言,而不是其他任何东西。另一个证明是,当我们调用childNodes 时,我们得到一个空的NodeList 列表对象。

    但是现在您已经创建了 XML 文档对象,只要您遵守 XML DOM 规范,就可以添加您想要的任何数据。在这一点上,你是对的:我们要做的第一件事就是创建根元素,所以让我们这样做:

    >>> root_element = xmldoc.createElement('root')
    >>> root_element.setAttribute('id', 'id1')
    

    上面的两行代码创建了一个我们称为root 的DOM 元素,并设置了一个我们称为id 的属性,其值为id1。但目前这根本不会影响我们的 XML 文档对象:

    >>> xmldoc.toxml()
    '<?xml version="1.0" ?>'
    

    要附加 root_element,我们会像处理任何其他普通元素一样:

    >>> xmldoc.appendChild(root_element)
    <DOM Element: root at 0x7f0d654a5bd8>
    

    如您所见,我们现在有一个名为 root 的根元素,并附加到我们之前创建的 XML 文档对象:

    >>> xmldoc.toxml()
    '<?xml version="1.0" ?><root id="id1"/>'
    

    但现在你可能会说:是什么让你认为 root_element 被视为根元素而不是普通元素?

    嗯:这是我们附加到 XML 文档的第一个元素,因此默认情况下,minidom 足够聪明,可以将其视为根元素,从现在开始将包装其他所有内容:

    >>> xmldoc.documentElement
    <DOM Element: root at 0x7f0d654a5bd8>
    >>> xmldoc.documentElement.tagName
    'root'
    

    希望这很清楚,如果没有,请不要犹豫,通过 cmets 询问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 2021-09-23
      • 2012-11-03
      相关资源
      最近更新 更多