【Python】基于DOM的XML⽂档解析(xml.dom.minidom)
⽂章⽬录
简介
是 DOM 接⼝的最⼩化实现,具有和其它语⾔类似的 API。它的⽬标是⽐完整的 DOM 简单,并且更为⼩巧。对于 DOM 不熟悉的⽤户⽤户应当考虑⽤ 模块来进⾏ XML ⽂件的处理。
开始
DOM 应⽤程序通常会从将某个 XML 解析为 DOM 开始。使⽤ xml.dom.minidom 时,这是通过各种解析函数来完成的:
from xml.dom.minidom import parse, parseString
dom1 = parse('c:\\temp\\l')# parse an XML file by name
datasource =open('c:\\temp\\l')
dom2 = parse(datasource)# parse an open file
dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')# parse a string
parse() 函数可以接受⼀个⽂件名或打开的⽂件对象。如果你将 XML 存为字符串,则可以改⽤ parseString() 函数。两个函数均返回⼀个代表⽂档内容的 Document 对象。
新建
你也可以通过在⼀个 DOM Implementation 对象上调⽤⽅法来创造 Document。此对象可通过调⽤ xml.dom 包或 xml.dom.minidom 模块中的 getDOMImplementation() 函数来获取。⼀旦你获得了⼀个 Document,你可以向其添加⼦节点来填充 DOM。
from xml.dom.minidom import getDOMImplementation
impl = getDOMImplementation()
newdoc = ateDocument(None,"some_tag",None)
top_element = newdoc.documentElement
text = ateTextNode('Some textual content.')
top_element.appendChild(text)
调⽤
⼀旦你得到了 DOM ⽂档对象,你就可以通过其的属性和⽅法访问 XML ⽂档的各个部分。这些属性定义在 DOM 规格说明当中。⽂档对象的主要特征属性是 documentElement 属性。它给出了 XML ⽂档中的主元素:即包含了所有其它元素的元素。以下是⼀个程序⽰例:
dom3 = parseString("<myxml>Some data</myxml>")
python处理xml文件assert dom3.documentElement.tagName == "myxml"
结束
当你完成⼀个 DOM 树的处理时,你可以选择调⽤ unlink() ⽅法以⿎励尽早清除不再需要的对象。unlink() 是 xml.dom.minidom 针对DOM API 的专属拓展,它会将特定节点和它的下级节点标记为不再有⽤。此外,Python 的垃圾回收器将负责处理树结构中的对象。
⽰例
程序代码:
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:
deType == node.TEXT_NODE:
rc.append(node.data)
return''.join(rc)
def handleSlideshow(slideshow):
print("<html>")
ElementsByTagName("title")[0]) slides = ElementsByTagName("slide")
handleToc(slides)
handleSlides(slides)
print("</html>")
def handleSlides(slides):
for slide in slides:
handleSlide(slide)
def handleSlide(slide):
ElementsByTagName("title")[0])
ElementsByTagName("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 = ElementsByTagName("title")[0]
print("<p>%s</p>"% getText(title.childNodes)) handleSlideshow(dom)
执⾏结果:
<html>
<title>Demo slideshow</title>
<p>Slide title</p>
<p>Another demo slide</p>
<h2>Slide title</h2>
<ul>
<li>This is a demo</li>
<li>Of a program for processing slides</li> </ul>
<h2>Another demo slide</h2>
<ul>
<li>It is important</li>
<li>To have more than</li>
<li>one slide</li>
</ul>
</html>
参考
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论