Python 官方文档:入门教程 => 点击学习
python中对两种解析方式的解释: The Python standard library provides a minimal but useful set of interfaces to work with XML. The t
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 对象同样提供了创建这些对象的方法。Node 对象提供了一个 ownerDocument 属性,此属性可把它们与在其中创建它们的 Document 关联起来。
IE: Internet Explorer, F: Firefox, O: Opera, 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 |
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 对象表示 XML 文档中的元素。元素可包含属性、其他元素或文本。如果元素含有文本,则在文本节点中表示该文本。
重要事项: 文本永远存储在文本节点中。在 DOM 处理过程中的一个常见的错误是,导航到元素节点,并认为此节点含有文本。不过,即使最简单的元素节点之下也拥有文本节点。举例,在 <year>2005</year> 中,有一个元素节点(year),同时此节点之下存在一个文本节点,其中含有文本(2005)。
由于元素对象也是一种节点,因此它可继承 Node 对象的属性和方法。
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 |
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 |
节点对象代表文档树中的一个节点。
Node 对象是整个 DOM 的主要数据类型。
节点对象代表文档树中的一个单独的节点。
节点可以是元素节点、属性节点、文本节点,或者也可以是“节点类型”那一节中所介绍的任何一种节点。
请注意,虽然所有的对象均能继承用于处理父节点和子节点的属性和方法,但是并不是所有的对象都拥有父节点或子节点。例如,文本节点不能拥有子节点,所以向类似的节点添加子节点就会导致 DOM 错误。
IE: Internet Explorer, F: Firefox, O: Opera, 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 |
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 |
--结束END--
本文标题: Python 解析XML
本文链接: https://lsjlt.com/news/190158.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0