Python模块libxml2

libxml2是一个很强大的处理XML文件的Python模块,通过C写成,这里介绍了一下基本的资料,安装,下载和基本指令,还有一个libxml2造成的内存泄露的处理方式。

libxml2是一个很强大的处理XML文件的Python模块,通过C写成,这里介绍了一下基本的资料,安装,下载和基本指令,还有一个libxml2造成的内存泄露的处理方式。

官方网址:
http://xmlsoft.org/
具体的下载地址,埋的很深,至少我花了一段时间才找到,这里直接给出win32下的Python模块下载地址:
http://xmlsoft.org/sources/win32/python/
根据自己的Python版本下载就行。

官方网站上给的操作信息是在少的可怜,只有单单一页的Python API介绍
http://xmlsoft.org/python.html

后来找了一些大神的博客才算零零碎碎的筹齐需要的知识点:
XPath (libxml2) in Python
http://ukchill.com/technology/getting-started-with-libxml2-and-python-part-1/
http://ukchill.com/technology/getting-started-with-libxml2-and-python-part-2/

这几就介绍一下最简单的操作:

import libxml2
doc = libxml2.parseFile(filename) #可以使用parseDoc代替parseFile,两者的区别是DOC处理已经读进进程的文件,File是能自己读取文件,所以只需要提供文件名。
ctxt = doc.xpathNewContext()
record_nodes = ctxt.xpathEval('/*') #括号中的XPATH,这是寻找的是根目录下的所有NODE。 xpathEval寻找结果给出的是一个x列表,如xrange(10)生成的内容。
for node in record_nodes:
    name = node.name #node的名字
    content = node.content #node的内容
    sous-nodes = node.xpathEval('*') #node下面的子node,同处理根目录的原理一下进行处理。
    ...

#释放内存
if doc:
    doc.freeDoc()

由于libxml2在读取xml文本后不会自动释放内存,因此会出现内存泄露问题,这个困扰了我好久,一直以为是Python的程序问题,,找了一大堆Python程序的内存管理资料,但是最后才发现是libxml2的问题。所以上面代码中给出了释放内存的指令,非常非常重要!

ps python下管理内存模块gc

import gc

a=['abc' for x in range(1000**5)]
del a
gc.collect()

xslt结构,template/call-templates/apply-templates调用

template模板在XSLT中是一个很重要的工具,通过匹配的方法用来处理XML文档,在template一共有三个主要标签,,,这里就介绍一些这三个标签并且的用法。

template模板在XSLT中是一个很重要的工具,通过匹配的方法用来处理XML文档。
操作作顺序,阅读器逐行读取XML文件,若遇到某一个元素在XSLT中有相关模板,就根据模板的规则处理元素内的数据,例如
<xsl:template match=””>
    <xsl:value-of select=”.”/>
</xsl:template>
通过”/”,匹配XML的根元素,那么在阅读器读取到XML(等于开始读取XML文本)的根元素时,将通过这个模板的设置进行数据处理,这个命令是输出非标签文本。
例如只使用:
<xsl:template match=””>
</xsl:template>
由于里面没有使用任何的对匹配文本的处理方式,那么输出结果为空。
那么假如处理下面的XML:
<aa>
        <bb>
                bbb
        </bb>
        <cc>
                ccc
        </cc>
        <dd>
                ddd1
        </dd>
        <dd>
                ddd2
        </dd>
</aa>
XSLT只有一个模板
<xsl:template match=”cc”>
    <h1><xsl:value-of select=”.”/></1>
</xsl:template>
那么输出结果,只有ccc被标题化,其他的只是纯文本拷贝。
因此我们还可以使用另外一个template去处理剩下的标签。
需要注意的是,一当根元素给”/”匹配了之后,那么剩下来的的模板就不在匹配任何的元素了,这种情况下也就是通常XSLT写法。
XSLT文件其实是一个或者多个XML文件的样式表,里面包含的功能会很丰富,因此在整个XSLT文件中有许多的template模板,模板与模板之间通过以下两种方式来来穿插使用:
<xsl:apply-templates>
<xsl:call-template>
这两个功能都是调用其他的模板,但是有所区别:
<xsl:apply-templates>,是在匹配到某个元素的时候,才采用模板,因此一定需要在XML文件中存在这个元素,如果不存在,将不进行任何操作。
调用例子:
<xsl:template match=”/”>
     <xsl:apply-templates select=”cc”/>
</xsl:template>
<xsl:template match=”cc”>
    处理的内容
</xsl:template>
<xsl:call-tempalte>,是直接调用一个模板,并将需要处理的数据通过<xsl:with-param>形式传递给模板,就想编程语言中的函数一样。
调用例子:
<xsl:template match=”/”>
     <xsl:call-template name=”template-name”>
              <xsl:with-param name=”name1″ select=”cc”/>
              <xsl:with-param name=”name2″>
                   <xsl:value-of select=”cc”/>
              </xsl:with-param>
</xsl:template>
<xsl:template name=”template-name”>
    <xsl:param select=”name1″>
    <xsl:param select=”name2″>
     处理内容
</xsl:template>
<xsl:call-template name=”name1″>, 这里虽然选择了name1,但是这个name1并不是XML文中的元素,而是直接调用模板name1。
这里我们也简单的说一下两个<xsl:with-param>的区别:
前面一个直接带select的标签,它的功能是传递元素cc给模板,再通过模板来处理cc下面的其他数据
后面一个不带的标签,根据上面的定义,它只是传递cc的值给模板。
假如说,传递给模板的元素带有其他的标签,就像前一个传递的内容一样,可以通过xslt的功能处理
如<xsl:value-of select=”.”/>取cc元素及其子元素中的所有纯文本。
在这里我曾遇到一个问题,那么就是在传递”格式化的文本“给模板的时候,我只想添加其他的格式标签并要保留文本内的其他格式标签,这个时候需要用到的是<xsl:copy>和<xsl:copy-of>,具体的例子就不说啦,等下次写到<xsl:copy>和<xsl:copy-of>的时候再说啦。