Minimual DOM - 在根节点上设置属性

时间:2018-04-18 01:07:42

标签: python xml plugins qgis minidom

最小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'

1 个答案:

答案 0 :(得分:1)

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

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

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

这段代码告诉我们什么?它只是说当你调用Document()时,你基本上创建了XML prolog而没有别的。另一个证据就是当我们调用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'

希望这是明确的,如果没有,那么请不要犹豫通过评论。