On this page
xml.dom.minidom —最小的 DOM 实现
xml.dom.minidom是文档对象模型接口的最小实现,其 API 与其他语言相似。它旨在比完整的 DOM 更简单,并且也明显更小。尚不熟悉 DOM 的用户应考虑改用xml.etree.ElementTree模块进行 XML 处理。
Warning
xml.dom.minidom模块不能安全防范恶意构建的数据。如果您需要解析不可信或未经身份验证的数据,请参见XML vulnerabilities。
DOM 应用程序通常从将某些 XML 解析为 DOM 开始。对于xml.dom.minidom,这是pass解析函数完成的:
from xml.dom.minidom import parse, parseString
dom1 = parse('c:\\temp\\mydata.xml') # parse an XML file by name
datasource = open('c:\\temp\\mydata.xml')
dom2 = parse(datasource) # parse an open file
dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')
parse()函数可以使用文件名或打开的文件对象。
xml.dom.minidom.
parse
(* filename_or_file , parser = None , bufsize = None *)- 从给定的 Importing 返回
Document
。 * filename_or_file *可以是文件名,也可以是类似文件的对象。 * parser *(如果提供)必须是 SAX2 解析器对象。此函数将更改解析器的文档处理程序并激活名称空间支持;其他解析器配置(例如设置实体解析器)必须事先完成。
- 从给定的 Importing 返回
如果字符串中包含 XML,则可以改用parseString()函数:
xml.dom.minidom.
parseString
(* string , parser = None *)- 返回代表* string *的
Document
。此方法为字符串创建一个io.StringIO对象,并将其传递给parse()。
- 返回代表* string *的
这两个函数都返回一个Document
对象,该对象代表文档的内容。
parse()和parseString()函数的作用是将 XML 解析器与“ DOM 构建器”连接,该生成器可以接受来自任何 SAX 解析器的解析事件并将其转换为 DOM 树。函数的名称可能会引起误解,但在学习接口时很容易掌握。这些函数返回之前,将完成文档的解析。只是这些函数本身不提供解析器实现。
您也可以pass在“ DOM Implementation”对象上调用方法来创建Document
。您可以pass调用xml.dom包中的getDOMImplementation()
函数或xml.dom.minidom模块来获取此对象。拥有Document
之后,您可以向其添加子节点以填充 DOM:
from xml.dom.minidom import getDOMImplementation
impl = getDOMImplementation()
newdoc = impl.createDocument(None, "some_tag", None)
top_element = newdoc.documentElement
text = newdoc.createTextNode('Some textual content.')
top_element.appendChild(text)
一旦有了 DOM 文档对象,就可以pass其属性和方法访问 XML 文档的各个部分。这些属性在 DOM 规范中定义。文档对象的主要属性是documentElement
属性。它为您提供 XML 文档中的主要元素:包含所有其他元素的元素。这是一个示例程序:
dom3 = parseString("<myxml>Some data</myxml>")
assert dom3.documentElement.tagName == "myxml"
完成 DOM 树后,可以选择调用unlink()
方法以鼓励及早清除现在不需要的对象。 unlink()
是 DOM API 的xml.dom.minidom特定扩展,它使节点及其后代基本上没有用。否则,Python 的垃圾收集器将finally处理树中的对象。
See also
xml.dom.minidom支持的 DOM 的 W3C 建议。
DOM Objects
xml.dom模块文档中提供了 Python 的 DOM API 的定义。本节列出了 API 和xml.dom.minidom之间的区别。
Node.
unlink
( )- 在 DOM 中break内部引用,以便在没有循环 GC 的 Python 版本上将其垃圾收集。即使有可用的循环 GC,使用它也可以更快地提供大量内存,因此,在不再需要 DOM 对象时立即对其进行调用是一种好习惯。这仅需要在
Document
对象上调用,但可以在子节点上调用以丢弃该节点的子代。
- 在 DOM 中break内部引用,以便在没有循环 GC 的 Python 版本上将其垃圾收集。即使有可用的循环 GC,使用它也可以更快地提供大量内存,因此,在不再需要 DOM 对象时立即对其进行调用是一种好习惯。这仅需要在
您可以避免使用with语句显式调用此方法。退出with
块时,以下代码将自动取消链接* dom *:
with xml.dom.minidom.parse(datasource) as dom:
... # Work with dom.
Node.
writexml
(* writer , indent =“” , addindent =“” , newl =“” *)- 将 XML 写入 writer 对象。编写器接收文本但不接收字节作为 Importing,它应具有与文件对象接口的
write()
方法匹配的write()
方法。 * indent *参数是当前节点的缩进。 * addindent *参数是用于当前节点的子节点的增量缩进。 * newl *参数指定用于终止换行符的字符串。
- 将 XML 写入 writer 对象。编写器接收文本但不接收字节作为 Importing,它应具有与文件对象接口的
对于Document
节点,可以使用其他关键字参数* encoding *来指定 XMLHeaders 的编码字段。
在版本 3.8 中进行了更改:writexml()方法现在保留了用户指定的属性 Sequences。
Node.
toxml
(* encoding = None *)- 返回包含由 DOM 节点表示的 XML 的字符串或字节字符串。
使用显式的* encoding * [1]参数,结果是指定编码中的字节字符串。如果没有* encoding *参数,则结果是 Unicode 字符串,并且结果字符串中的 XML 语句未指定编码。由于 UTF-8 是 XML 的默认编码,因此使用 UTF-8 以外的其他编码对该字符串进行编码可能不正确。
在版本 3.8 中进行了更改:toxml()方法现在保留了用户指定的属性 Sequences。
Node.
toprettyxml
(* indent =“t” , newl =“n” , encoding = None *)- 返回文档的印刷精美版本。 * indent *指定缩进字符串,默认为制表符; * newl *指定在每行末尾发出的字符串,默认为
\n
。
- 返回文档的印刷精美版本。 * indent *指定缩进字符串,默认为制表符; * newl *指定在每行末尾发出的字符串,默认为
- encoding *参数的行为类似于toxml()的相应参数。
在版本 3.8 中进行了更改:toprettyxml()方法现在保留了用户指定的属性 Sequences。
DOM Example
该示例程序是一个简单程序的相当实际的示例。在这种特殊情况下,我们没有充分利用 DOM 的灵 Active。
import xml.dom.minidom
document = """\
<slideshow>
<title>Demo slideshow</title>
<slide><title>Slide title</title>
<point>This is a demo</point>
<point>Of a program for processing slides</point>
</slide>
<slide><title>Another demo slide</title>
<point>It is important</point>
<point>To have more than</point>
<point>one slide</point>
</slide>
</slideshow>
"""
dom = xml.dom.minidom.parseString(document)
def getText(nodelist):
rc = []
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc.append(node.data)
return ''.join(rc)
def handleSlideshow(slideshow):
print("<html>")
handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])
slides = slideshow.getElementsByTagName("slide")
handleToc(slides)
handleSlides(slides)
print("</html>")
def handleSlides(slides):
for slide in slides:
handleSlide(slide)
def handleSlide(slide):
handleSlideTitle(slide.getElementsByTagName("title")[0])
handlePoints(slide.getElementsByTagName("point"))
def handleSlideshowTitle(title):
print("<title>%s</title>" % getText(title.childNodes))
def handleSlideTitle(title):
print("<h2>%s</h2>" % getText(title.childNodes))
def handlePoints(points):
print("<ul>")
for point in points:
handlePoint(point)
print("</ul>")
def handlePoint(point):
print("<li>%s</li>" % getText(point.childNodes))
def handleToc(slides):
for slide in slides:
title = slide.getElementsByTagName("title")[0]
print("<p>%s</p>" % getText(title.childNodes))
handleSlideshow(dom)
minidom 和 DOM 标准
xml.dom.minidom模块实质上是具有 DOM 2 Function(主要是名称空间Function)的 DOM 1.0 兼容 DOM。
Python 中 DOM 接口的用法很简单。以下 Map 规则适用:
pass实例对象访问接口。应用程序不应实例化类本身;他们应该使用
Document
对象上可用的创建者Function。派生接口支持基本接口中的所有操作(和属性),以及所有新操作。操作用作方法。由于 DOM 仅使用in参数,因此参数以正常 Sequences(从左到右)传递。没有可选参数。
void
个操作返回None
。IDL 属性 Map 到实例属性。为了与用于 Python 的 OMG IDL 语言 Map 兼容,还可以pass访问器方法
_get_foo()
和_set_foo()
访问属性foo
。readonly
属性不得更改;在运行时不强制执行此操作。类型
short int
,unsigned int
,unsigned long long
和boolean
都 Map 到 Python 整数对象。类型
DOMString
Map 到 Python 字符串。 xml.dom.minidom支持字节或字符串,但通常会产生字符串。DOMString
类型的值也可以是None
,在 W3C 的 DOM 规范中允许具有 IDLnull
值。const
语句 Map 到各自范围内的变量(例如xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE
);它们一定不能更改。xml.dom.minidom目前不支持
DOMException
。相反,xml.dom.minidom使用标准的 Python 异常,例如TypeError和AttributeError。NodeList
对象是使用 Python 的内置列表类型实现的。这些对象提供了 DOM 规范中定义的接口,但是在 Python 的早期版本中,它们不支持官方 API。但是,它们比 W3C 建议中定义的接口更“ Pythonic”。
以下接口在xml.dom.minidom中没有实现:
DOMTimeStamp
EntityReference
这些大多数反映在 XML 文档中的信息对于大多数 DOM 用户而言并不是通用的。
Footnotes
- [1]
- XML 输出中包含的编码名称应符合适当的标准。例如,“ UTF-8”有效,但在 XML 文档的语句中“ UTF8”无效,即使 Python 接受它作为编码名称。参见https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl和https://www.iana.org/assignments/character-sets/character-sets.xhtml。