文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python 解析XML

2023-01-31 06:38

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

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 文件的下载是否应当被同步处理。 5 1.5 9 No
childNodes 返回属于文档的子节点的节点列表。 5 1 9 Yes
doctype 返回与文档相关的文档类型声明 (DTD)。 6 1 9 Yes
documentElement 返回文档的根节点 5 1 9 Yes
documentURI 设置或返回文档的位置 No 1 9 Yes
domConfig 返回normalizeDocument()被调用时所使用的配置     No Yes
firstChild 返回文档的首个子节点 5 1 9 Yes
implementation 返回处理该文档的 DOMImplementation 对象。 No 1 9 Yes
inputEncoding 返回用于文档的编码方式(在解析时)。 No 1 No Yes
lastChild 返回文档的最后一个子节点。 5 1 9 Yes
nodeName 依据节点的类型返回其名称。 5 1 9 Yes
nodeType 返回节点的节点类型。 5 1 9 Yes
nodeValue 根据节点的类型来设置或返回节点的值。 5 1 9 Yes
strictErrorChecking 设置或返回是否强制进行错误检查。 No 1 No Yes
text 返回节点及其后代的文本(仅用于 IE)。 5 No No No
xml 返回节点及其后代的 XML(仅用于 IE)。 5 No No No
xmlEncoding 返回文档的编码方法。 No 1 No Yes
xmlStandalone 设置或返回文档是否为 standalone。 No 1 No Yes
xmlVersion 设置或返回文档的 XML 版本。 No 1 No Yes

Document 对象的方法

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

 

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

Element 对象

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

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

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

Element 对象的属性

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

Element 对象的方法

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

 

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

Node 对象

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

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

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

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

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

Node 对象的属性

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

Node 对象的方法

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

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯