Python 解析XML

  1. Python中对两种解析方式的解释:

XML Parser Architectures and APIs:

The Python standard library provides a minimal but useful set of interfaces to work with XML.

The two most basic and broadly used APIs to XML data are the SAX and DOM interfaces.

  • Simple API for XML (SAX) : Here you register callbacks for events of interest and then let the parser proceed through the document. This is useful when your documents are large or you have memory limitations, it parses the file as it reads it from disk, and the entire file is never stored in memory.

  • Document Object Model (DOM) API : This is World Wide Web Consortium recommendation wherein the entire file is read into memory and stored in a hierarchical (tree-based) form to represent all the features of an XML document.

SAX obviously can't process information as fast as DOM can when working with large files. On the other hand, using DOM exclusively can really kill your resources, especially if used on a lot of small files.

SAX is read-only, while DOM allows changes to the XML file. Since these two different APIs literally complement each other there is no reason why you can't use them both for large projects.


转载

   XML文档成功解析后,有些XML解析器会将文档数据以树结构形式存储到内存中,这个层次化的树结构称为“文档对象模型”(DOM)树,能够创建这类结构 的XML解析器称为“DOM解析器”。DOM树将XML文档的每个组件表示成树上的一个结点。DOM只有单独一个“根结点”,即“文档根”,其中包含文档 中的其他所有结点。每个结点都是一个对象,它具有自己的属性和方法。

     SAX(Simple API for XML)于1998年5月发布。SAX是解析XML文档的另一种方法,使用的是一种“基于事件的模型”。基于SAX的解析器在处理文档时,会生成名为“事 件”的通知信息。软件程序可“侦听”这些事件,以便从文档获取数据。例如,用于生成邮件列表的一个程序可从XML文档读取姓名和地址信息,而这个文档包含 的并不仅仅是邮寄地址信息,比如还可能包括生日、电话号码和电子邮件地址等等。程序可用SAX解析器对文档进行解析,并只侦听包含姓名和地址信息的事件。 大量程序语言都可使用基于SAX的解析器,比如Python、java和C++等等。

      针对XML文档数据的访问,SAX和DOM提供了截然不同的API。每种API都有自己的优点和缺点。DOM是一种基于树的模型,将文档数据存储到一个由 结点构成的层次结构中。程序可快速的访问数据,因为所有文档数据都在内存中。DOM还提供了相应的机制来增删节点,从而简化了程序对XML文档的修改。

     基于SAX的解析器在遇到标记时,要调用“侦听器方法”。使用这种基于事件的模型,以SAX为基础的解析器不会创建一个树结构来存储XML文档数据。相 反,在找到数据时,解析器会将数据传给应用程序。相较于基于DOM的解析器,这样可获得更好的性能,内存开销也较小。事实上,许多DOM解析器都在幕后使 用SAX解析器,以便从文档中获取数据,并在内存中生成DOM树。许多程序员都认为,使用DOM树结构,可以更容易的遍历及处理XML文档。因此,程序常 常用SAX解析器读取不会由程序修改的XML文档。

     性能:1、处理大型XML文档时,基于SAX的解析器通常笔基于DOM的解析器更有效,尤其重要的是,基于SAX的解析器不会将整个XML文档载入内存。

               2、如果文档只需解析一次,那么最有效的就是基于SAX的解析。程序要从文档快速获取信息时,DOM解析器通常闭SAX解析更有效。

               3、要求节省内存的程序通常使用基于SAX的解析器。SAX是独立于W3C的,DOM是正式的W3C推荐规范。

 

更多内容参考:http://www.tutorialspoint.com/python/python_xml_processing.htm

 


 

谈下简单的理解:

貌似用SAX要麻烦一些,因为你需要实现自己的ContentHandler,用到的包xml.sax

 

Parsing XML with SAX generally requires you to create your own ContentHandler, by subclassing xml.sax.ContentHandler.

 

而用DOM解析:

需要用到的module:

from xml.dom.minidom import parse

import xml.dom.minidom

 

The easiest way to quickly load an XML document and to create a minidom object using the xml.dom module. The minidom object provides a simple parser method that will quickly create a DOM tree from the XML file.

The sample phrase calls the parse( file [,parser] ) function of the minidom object to parse the XML file designated by file into a DOM tree object.

 

一个简单的例子:

<build>
  <crib_root>
     <path release="1a">projects/d/dte/10a/</path>
     <path release="1b">projects/d/f_dvild/10b/</path>
     <path release="1a">projects/d/v_vld/11a/</path>
  </crib_root>

</ build> 

代码:

 

from xml.dom.minidom import parse
import xml.dom.minidom

# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("build_directory_structure.xml")

#DOMTree = xml.dom.minidom.parse("test.xml")
collection = DOMTree.documentElement

if collection.hasAttribute("build"):
    print "Root element : %s" % collection.getAttribute("build")
crib_root = collection.getElementsByTagName("crib_root")

for crib in crib_root:
   print "*****crib*****"
   
   for path in range(len(crib.getElementsByTagName('path'))):
        print path
        print (crib.getElementsByTagName('path')[path]).childNodes[0].data

 

Dom解析的具体API可在这里找到:http://docs.python.org/library/xml.dom.html

 

附加XML中的element 对象和document 对象的说明 :(转载)

 

 

Document 对象代表整个 XML 文档。

Document 对象

Document 对象是一棵文档树的根,可为我们提供对文档数据的最初(或最顶层)的访问入口。

用于元素节点、文本节点、注释、处理指令等均无法存在于 document 之外,document 对象同样提供了创建这些对象的方法。Node 对象提供了一个 ownerDocument 属性,此属性可把它们与在其中创建它们的 Document 关联起来。

IE: Internet Explorer, F: Firefox, O: Opera, W3C: 万维网联盟 (因特网标准)

Document 对象的属性

属性 描述 IE F O W3C
async 规定 XML 文件的下载是否应当被同步处理。51.59No
childNodes 返回属于文档的子节点的节点列表。519Yes
doctype 返回与文档相关的文档类型声明 (DTD)。619Yes
documentElement 返回文档的根节点519Yes
documentURI 设置或返回文档的位置No19Yes
domConfig返回normalizeDocument()被调用时所使用的配置  NoYes
firstChild 返回文档的首个子节点519Yes
implementation 返回处理该文档的 DOMImplementation 对象。No19Yes
inputEncoding 返回用于文档的编码方式(在解析时)。No1NoYes
lastChild 返回文档的最后一个子节点。519Yes
nodeName 依据节点的类型返回其名称。519Yes
nodeType 返回节点的节点类型。519Yes
nodeValue 根据节点的类型来设置或返回节点的值。519Yes
strictErrorChecking 设置或返回是否强制进行错误检查。No1NoYes
text 返回节点及其后代的文本(仅用于 IE)。5NoNoNo
xml 返回节点及其后代的 XML(仅用于 IE)。5NoNoNo
xmlEncoding 返回文档的编码方法。No1NoYes
xmlStandalone 设置或返回文档是否为 standalone。No1NoYes
xmlVersion 设置或返回文档的 XML 版本。No1NoYes

Document 对象的方法

属性 描述 IE F O W3C
adoptNode(sourcenode)从另一个文档向本文档选定一个节点,然后返回被选节点。  NoYes
createAttribute(name) 创建拥有指定名称的属性节点,并返回新的 Attr 对象。619Yes
createAttributeNS(uri,name) 创建拥有指定名称和命名空间的属性节点,并返回新的 Attr 对象。  9Yes
createCDATASection() 创建 CDATA 区段节点。519Yes
createComment() 创建注释节点。619Yes
createDocumentFragment()创建空的 DocumentFragment 对象 ,并返回此对象。519Yes
createElement() 创建元素节点。519Yes
createElementNS() 创建带有指定命名空间的元素节点。No19Yes
createEvent() 创建新的 Event 对象。   Yes
createEntityReference(name)创建 EntityReference 对象,并返回此对象。5 NoYes
createExpression() 创建一个XPath表达式以供稍后计算。   Yes
createProcessingInstruction(target,data) 创建 ProcessingInstruction 对象,并返回此对象。5 9Yes
createRange() 创建 Range 对象,并返回此对象。No  Yes
evaluate() 计算一个 XPath 表达式。No19Yes
createTextNode() 创建文本节点。519Yes
getElementById() 查找具有指定的唯一 ID 的元素。519Yes
getElementsByTagName() 返回所有具有指定名称的元素节点。519Yes
getElementsByTagNameNS() 返回所有具有指定名称和命名空间的元素节点。No19Yes
importNode() 把一个节点从另一个文档复制到该文档以便应用。  9Yes
loadXML() 通过解析XML标签字符串来组成文档。    
normalizeDocument()   NoYes
renameNode() 重命名元素或者属性节点。  NoYes

 

Element 对象表示 XML 文档中的元素。

Element 对象

Element 对象表示 XML 文档中的元素。元素可包含属性、其他元素或文本。如果元素含有文本,则在文本节点中表示该文本。

重要事项: 文本永远存储在文本节点中。在 DOM 处理过程中的一个常见的错误是,导航到元素节点,并认为此节点含有文本。不过,即使最简单的元素节点之下也拥有文本节点。举例,在 <year>2005</year> 中,有一个元素节点(year),同时此节点之下存在一个文本节点,其中含有文本(2005)。

由于元素对象也是一种节点,因此它可继承 Node 对象的属性和方法。

Element 对象的属性

属性 描述 IE F O W3C
attributes 返回元素的属性的 NamedNodeMap519Yes
baseURI 返回元素的绝对基准 URINo1NoYes
childNodes 返回元素的子节点的 NodeList519Yes
firstChild 返回元素的首个子节点519Yes
lastChild 返回元素的最后一个子节点519Yes
localName 返回元素名称的本地部分No19Yes
namespaceURI 返回元素的命名空间 URINo19Yes
nextSibling 返回元素之后紧跟的节点519Yes
nodeName 返回节点的名称,依据其类型。519Yes
nodeType 返回节点的类型519Yes
ownerDocument 返回元素所属的根元素 (document 对象)519Yes
parentNode 返回元素的父节点519Yes
prefix 设置或返回元素的命名空间前缀No19Yes
previousSibling 返回元素之前紧随的节点519Yes
schemaTypeInfo返回与元素相关联的类型信息  NoYes
tagName 返回元素的名称519Yes
textContent 设置或返回元素及其后代的文本内容No1NoYes
text 返回节点及其后代的文本 (IE-only)5NoNoNo
xml 返回节点及其后代的 XML (IE-only)5NoNoNo

Element 对象的方法

方法 描述 IE F O W3C
appendChild() 向节点的子节点列表末尾添加新的子节点。519Yes
cloneNode() 克隆节点。519Yes
compareDocumentPosition() 比较两节点的文档位置。No1NoYes
dispatchEvent() 给节点分派一个合成事件。519Yes
getAttribute() 返回属性的值。519Yes
getAttributeNS() 返回属性的值。No19Yes
getAttributeNode() 以 Attribute 对象返回属性节点。519Yes
getAttributeNodeNS() 以 Attribute 对象返回属性节点。No 9Yes
getElementsByTagName() 找到具有指定标签名的子孙元素。519Yes
getElementsByTagNameNS() 找到具有指定标签名和命名空间的元素。No19Yes
getFeature(feature,version)返回 DOM 对象,此对象可执行拥有指定特性和版本的专门的 API。  NoYes
getUserData(key)返回关联节点上键的对象。此对象必须首先通过使用相同的键来调用 setUserData 来设置到此节点。  NoYes
hasAttribute() 返回元素是否拥有指定的属性。519Yes
hasAttributeNS() 返回元素是否拥有指定的属性。No19Yes
hasAttributes() 返回元素是否拥有属性。519Yes
hasChildNodes() 返回元素是否拥有子节点。519Yes
insertBefore() 在已有的子节点之前插入一个新的子节点。519Yes
isDefaultNamespace(URI)返回指定的命名空间 URI 是否为默认。  NoYes
isEqualNode() 检查两节点是否相等。NoNoNoYes
isSameNode() 检查两节点是否为同一节点。No1NoYes
isSupported(feature,version)返回指定的特性是否在此元素上得到支持。  9Yes
lookupNamespaceURI() 返回匹配指定前缀的命名空间 URI。No1NoYes
lookupPrefix() 返回匹配指定的命名空间 URI 的前缀。No1NoYes
normalize() 519Yes
removeAttribute() 删除指定的属性。519Yes
removeAttributeNS() 删除指定的属性。No19Yes
removeAttributeNode() 删除指定的属性节点。519Yes
removeChild() 删除子节点。519Yes
replaceChild() 替换子节点。519Yes
setUserData(key,data,handler)把对象关联到元素上的键。  NoYes
setAttribute() 添加新属性。519Yes
setAttributeNS() 添加新属性。 19Yes
setAttributeNode() 添加新的属性节点。519Yes
setAttributeNodeNS(attrnode)添加新的属性节点。  9Yes
setIdAttribute(name,isId)如果 Attribute 对象 isId 属性为 true,那么此方法会把指定的属性声明为一个用户确定 ID 的属性(user-determined ID attribute)。  NoYes
setIdAttributeNS(uri,name,isId)如果 Attribute 对象 isId 属性为 true,那么此方法会把指定的属性声明为一个用户确定 ID 的属性(user-determined ID attribute)(带有命名空间)。  NoYes
setIdAttributeNode(idAttr,isId)如果 Attribute 对象 isId 属性为 true,那么此方法会把指定的属性声明为一个用户确定 ID 的属性(user-determined ID attribute)。  NoYes

 

节点对象代表文档树中的一个节点。

Node 对象

Node 对象是整个 DOM 的主要数据类型。

节点对象代表文档树中的一个单独的节点。

节点可以是元素节点、属性节点、文本节点,或者也可以是“节点类型”那一节中所介绍的任何一种节点。

请注意,虽然所有的对象均能继承用于处理父节点和子节点的属性和方法,但是并不是所有的对象都拥有父节点或子节点。例如,文本节点不能拥有子节点,所以向类似的节点添加子节点就会导致 DOM 错误。

IE: Internet Explorer, F: Firefox, O: Opera, W3C: 万维网联盟 (因特网标准)

Node 对象的属性

属性 描述 IE F O W3C
baseURI 返回节点的绝对基准 URI。No1NoYes
childNodes 返回节点到子节点的节点列表。519Yes
firstChild 返回节点的首个子节点。519Yes
lastChild 返回节点的最后一个子节点。519Yes
localName 返回节点的本地名称。No19Yes
namespaceURI 返回节点的命名空间 URI。No19Yes
nextSibling 返回节点之后紧跟的同级节点。519Yes
nodeName 返回节点的名称,根据其类型。519Yes
nodeType 返回节点的类型。519Yes
nodeValue 设置或返回节点的值,根据其类型。519Yes
ownerDocument 返回节点的根元素(document 对象)。519Yes
parentNode 返回节点的父节点。519Yes
prefix 设置或返回节点的命名空间前缀。No19Yes
previousSibling 返回节点之前紧跟的同级节点。519Yes
textContent 设置或返回节点及其后代的文本内容。No1NoYes
text 返回节点及其后代的文本(IE 独有的属性)。5NoNoNo
xml 返回节点及其后代的 XML(IE 独有的属性)。5NoNoNo

Node 对象的方法

方法 描述 IE F O W3C
appendChild() 向节点的子节点列表的结尾添加新的子节点。519Yes
cloneNode() 复制节点。519Yes
compareDocumentPosition() 对比两个节点的文档位置。No1NoYes
getFeature(feature,version)返回一个 DOM 对象,此对象可执行带有指定特性和版本的专门的 API。  NoYes
getUserData(key)返回与此节点上的某个键相关联的对象。此对象必须首先通过使用相同的键来调用 setUserData 被设置到此节点。  NoYes
hasAttributes() 判断当前节点是否拥有属性。No19Yes
hasChildNodes() 判断当前节点是否拥有子节点。519Yes
insertBefore() 在指定的子节点前插入新的子节点。519Yes
isDefaultNamespace(URI)返回指定的命名空间 URI 是否为默认。  NoYes
isEqualNode() 检查两个节点是否相等。NoNoNoYes
isSameNode() 检查两个节点是否是相同的节点。No1NoYes
isSupported() 返回当前节点是否支持某个特性。  9Yes
lookupNamespaceURI() 返回匹配指定前缀的命名空间 URI。No1NoYes
lookupPrefix() 返回匹配指定命名空间 URI 的前缀。No1NoYes
normalize() 合并相邻的Text节点并删除空的Text节点。519Yes
removeChild() 删除(并返回)当前节点的指定子节点。519Yes
replaceChild() 用新节点替换一个子节点。519Yes
selectNodes() 用一个 XPath 表达式查询选择节点。6   
selectSingleNode() 查找和 XPath 查询匹配的一个节点。6   
transformNode() 使用 XSLT 把一个节点转换为一个字符串。6   
transformNodeToObject() 使用 XSLT 把一个节点转换为一个文档。6   
setUserData(key,data,handler)把对象关联到节点上的一个键上。  NoYes

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惹不起的程咬金

来都来了,不赏点银子么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值