python xml

 无聊的时候玩玩人人农场,不知不觉等级就高了,于是乎就招偷了……作为一个玩农场的程序员,不能对此束手无策的!写个收菜的程序吧,顺便练练Python!

 

     研究了一下人人网的wap页面,写下了如下的代码:

 

Python代码 复制代码
  1. #! /usr/bin/env python   
  2. #coding=utf-8   
  3. import urllib2,urllib   
  4. from xml.dom import minidom   
  5. from HTMLParser import HTMLParser   
  6. LOGIN_URL='http://3g.renren.com/login.do?fx=0&autoLogin=true'  
  7.   
  8. def login(user, passwd):   
  9.     data=urllib.urlencode({   
  10.     'origURL':'/home.do',   
  11.     'email':user,   
  12.     'password':passwd,   
  13.     'login':'/xe7/x99/xbb/xe5/xbd/x95'  
  14.     })   
  15.     fd=urllib2.urlopen(LOGIN_URL,data)   
  16.     return fd.read()   
  17.        
  18. def getAppUrl(page):   
  19.     doc=minidom.parseString(page)   
  20.     appDiv=doc.getElementsByTagName('body')[0].getElementsByTagName('div')[3]   
  21.     for a in appDiv.getElementsByTagName('a'):   
  22.         url=a.getAttribute('href')   
  23.         if url and 'apps.do' in url:   
  24.             return url   
  25.     else:   
  26.         print '没有找到“应用”页面的链接'.decode('utf-8').encode('gbk')   
  27.            
  28. def getFarmUrl(page):   
  29.     doc=minidom.parseString(page)   
  30.     farmDiv=doc.getElementsByTagName('body')[0].getElementsByTagName('div')[5]   
  31.     for a in farmDiv.getElementsByTagName('a'):   
  32.         url=a.getAttribute('href')   
  33.         if url and 'appid=53429' in url:   
  34.             return url   
  35.     else:   
  36.         print '没有找到“人人农场”页面的链接'.decode('utf-8').encode('gbk')   
  37.   
  38.   
  39. def visitUrl(url):   
  40.     fd=urllib2.urlopen(url)   
  41.     return fd.read()   
  42.   
  43. def harvestFarm(user, passwd):   
  44.     print '收获'.decode('utf-8').encode('gbk')+user+/   
  45.     '的农场……'.decode('utf-8').encode('gbk')   
  46.     appurl=getAppUrl(login(user, passwd))   
  47.     farmurl=getFarmUrl(visitUrl(appurl))   
  48.     tp=TargetsParser()   
  49.     tp.feed(visitUrl(farmurl))   
  50.     linkLists= tp.getTargets()   
  51.     for url in linkLists:   
  52.         hlp=HarvestLinkParser()   
  53.         hlp.feed(visitUrl(url))   
  54.         if hlp.getHarvestLink():   
  55.             visitUrl(hlp.getHarvestLink())   
  56.     print '收工离开此农场'.decode('utf-8').encode('gbk')   
  57.                
  58. class TargetsParser(HTMLParser):   
  59.     def __init__(self):   
  60.         self.targets=[]   
  61.         HTMLParser.__init__(self)   
  62.     def handle_starttag(self, tag, attrs):   
  63.         if tag!='a':   
  64.             return  
  65.         href=[value for key,value in attrs if key=='href']   
  66.         for url in href:   
  67.             if 'myCropAction.php' in url or 'myTreeAction.php' in url or/   
  68.             'myAnimalAction.php' in url or 'myMachineAction.php' in url:   
  69.                 self.targets.append('http://mapp.renren.com'+url)   
  70.     def getTargets(self):   
  71.         return self.targets   
  72.   
  73. class HarvestLinkParser(HTMLParser):   
  74.     def __init__(self):   
  75.         self.link=''  
  76.         HTMLParser.__init__(self)   
  77.     def handle_starttag(self, tag, attrs):   
  78.         if tag!='a':   
  79.             return  
  80.         href=[value for key,value in attrs if key=='href']   
  81.         for url in href:   
  82.             if 'wap,reapAllAction.php' in url:   
  83.                 self.link='http://mapp.renren.com'+url   
  84.     def getHarvestLink(self):   
  85.         return self.link   
  86.   
  87. if __name__=='__main__':   
  88.     userList=[('email','password')]   
  89.     for u,p in userList:   
  90.         harvestFarm(u,p)  
#! /usr/bin/env python
#coding=utf-8
import urllib2,urllib
from xml.dom import minidom
from HTMLParser import HTMLParser
LOGIN_URL='http://3g.renren.com/login.do?fx=0&autoLogin=true'

def login(user, passwd):
    data=urllib.urlencode({
    'origURL':'/home.do',
    'email':user,
    'password':passwd,
    'login':'/xe7/x99/xbb/xe5/xbd/x95'
    })
    fd=urllib2.urlopen(LOGIN_URL,data)
    return fd.read()
    
def getAppUrl(page):
    doc=minidom.parseString(page)
    appDiv=doc.getElementsByTagName('body')[0].getElementsByTagName('div')[3]
    for a in appDiv.getElementsByTagName('a'):
        url=a.getAttribute('href')
        if url and 'apps.do' in url:
            return url
    else:
        print '没有找到“应用”页面的链接'.decode('utf-8').encode('gbk')
        
def getFarmUrl(page):
    doc=minidom.parseString(page)
    farmDiv=doc.getElementsByTagName('body')[0].getElementsByTagName('div')[5]
    for a in farmDiv.getElementsByTagName('a'):
        url=a.getAttribute('href')
        if url and 'appid=53429' in url:
            return url
    else:
        print '没有找到“人人农场”页面的链接'.decode('utf-8').encode('gbk')


def visitUrl(url):
    fd=urllib2.urlopen(url)
    return fd.read()

def harvestFarm(user, passwd):
    print '收获'.decode('utf-8').encode('gbk')+user+/
    '的农场……'.decode('utf-8').encode('gbk')
    appurl=getAppUrl(login(user, passwd))
    farmurl=getFarmUrl(visitUrl(appurl))
    tp=TargetsParser()
    tp.feed(visitUrl(farmurl))
    linkLists= tp.getTargets()
    for url in linkLists:
        hlp=HarvestLinkParser()
        hlp.feed(visitUrl(url))
        if hlp.getHarvestLink():
            visitUrl(hlp.getHarvestLink())
    print '收工离开此农场'.decode('utf-8').encode('gbk')
            
class TargetsParser(HTMLParser):
    def __init__(self):
        self.targets=[]
        HTMLParser.__init__(self)
    def handle_starttag(self, tag, attrs):
        if tag!='a':
            return
        href=[value for key,value in attrs if key=='href']
        for url in href:
            if 'myCropAction.php' in url or 'myTreeAction.php' in url or/
            'myAnimalAction.php' in url or 'myMachineAction.php' in url:
                self.targets.append('http://mapp.renren.com'+url)
    def getTargets(self):
        return self.targets

class HarvestLinkParser(HTMLParser):
    def __init__(self):
        self.link=''
        HTMLParser.__init__(self)
    def handle_starttag(self, tag, attrs):
        if tag!='a':
            return
        href=[value for key,value in attrs if key=='href']
        for url in href:
            if 'wap,reapAllAction.php' in url:
                self.link='http://mapp.renren.com'+url
    def getHarvestLink(self):
        return self.link

if __name__=='__main__':
    userList=[('email','password')]
    for u,p in userList:
        harvestFarm(u,p)

      经过测试,已经可以实现收菜功能了。接下来的任务是:定时收菜、自动定时收菜、收菜时顺便偷菜……

 

 

 

      嘿嘿,分享代码仅作为技术交流~

我故意写的详细一点,好让你明白怎么用。呵呵,当然你可以写得简练一点。


from xml.dom.minidom import parse


    xml_file = "pkg.xml"
    doc = parse(xml_file)
    pkgs = doc.getElementsByTagName("pkg")
    pkg = pkgs[0]
    commands = doc.getElementsByTagName("command")
    command = commands[0]
    acc_id = command.getAttribute("acc_id")
    print acc_id

 

python创建xml文件

万事开头难。

想要找一个例子看看如何用python来将一些数据生成一个.xml文件真不容易。昨天基本上是怎么也没干成,算是今天的铺垫吧。用百度我是没找到 有用的信息,只有一篇似乎有点用处,作者说他的程序可以运行,可根本不是那么回事。这样的例子找不到的原因可能是大虾没时间写,菜鸟不会写。还是 google好用,也是,外国的东西确实比较好(我很爱国的,别骂我!),他们的程序员也有闲心也有时间写这样的小程序,如果没有这样的程序,初学者真不 知道怎么入门。

Creating XML With Python

Part 1: xml.dom.minidom Basics

There are many resources out there if you’d like to consume and parse XML with Python. I was looking around the web for resources on producing XML with Python, and I wasn’t able to find much. Here is a pretty simple script and its output. It will create a WML document.

 from xml.dom.minidom import Document

# Create the minidom document 
doc = Document()
# Create the  base element 
wml = doc.createElement("wml") 
doc.appendChild(wml) 
# Create the main  element
maincard = doc.createElement("card") 
maincard.setAttribute("id", "main") 
wml.appendChild(maincard)  
#Create aelement 
paragraph1 = doc.createElement("p") 
maincard.appendChild(paragraph1)  
# Give theelemenet some text 
ptext = doc.createTextNode("This is a test!") 
paragraph1.appendChild(ptext)  
# Print our newly created XML 
print doc.toprettyxml(indent=" ") 

(This code was highlighted by Gnu source-highlight. You can grab a text version here.) Here’s what the above code produces:

This is a test!

As an aside, this XML will probably not parse on a WAP/WML mobile device, as it doesn’t have a DOCTYPE.

You can see that creating arbitrary XML with the minidom is nearly trivial. I didn’t say intuitive, I said nearly trivial. I’m sure that there are better ways of producing XML, but right now the documentation and tutorials are weak at best. Stay tuned for more.

来自于:http://www.postneo.com/projects/pyxml/

这些信息已经足够用了。

程 序组织的思维方式与表现形式和Java没有什么大的区别,都是先生成一个个对象(Java中这么说,python没看过中文资料,不知道怎么称呼,英文的 我也不知道,是element??),再添加,和创建JavaGUI界面时的感觉一样,new完了add,一个容器装另一个容器或部件。

会了就感觉不到难度了,现在我已经可以把一个页面的信息生成为.xml了,下面马上要做的是在同一个.xml文件中生成第二个结构相同的element.然后就要写新的程序,可以自动将多个页面的信息都生成xml格式,放到一个或多个.xml文件中。

估计当这些做完了,就应该学习怎么parse xml了,这样的信息很好找, 到处都是。然后写程序将分离出来的信息分别存入数据库中的相应的字段中,然后还需要写动态页面,将数据库中的内容表现出来。时间不多了,我也不确定自己能不能完成这些,还要更努力才行。

 

python操作xml心得体会zz

最近在用Python操作XML,两天后有一些基础心得,其实这些东东差不多都在网上有了答案,只是第一次做这种东东,有一些情况还不知道,现在写下来,为新手服务。本人菜鸟一只,软件水平一般,又刚刚开始用python编程,文中难免会有错误,希望读者对文中观点持怀疑态度来观看。 在这里要感谢:
令狐虫:没有你提供的“伪”代码,我这个菜鸟需要花很长时间来试验实现
猛禽:为这段程序提供了getXMLNodeText函数
TR:提供了这个供我“测试”发布文章的空间
失踪的月亮:帮我找到了英文的python操作msxml资料



第一个问题:数据编码引起的问题
起因:因为用户系统生成的XML不能算是标准,用的是gb2312编码,MSXMLCOM组件对这种东东处理到是没有问题,但python基础库中的xml.dom.minidom只支持UTF-8的编码规则,如果用xml.dom.minidom.parse直接打开会报错。
解决:先以文本的方式打开open(sourcefile)然后对文本中的gb2312编码进行替换        
Data = open(sourcefile)
data = data.replace(’gb2312′, ‘utf-8′)
data = data.replace(’GB2312′, ‘utf-8′)

然后以xml.dom.minidom.parseString(data)这种方式生成xmldom对像,不能打开gb2312编码的xml文件问题解决。
第二个问题:XML中中文字符引起的问题
起因:用户系统生成的xml文件中含有中文字符串,当对前面生成的xmldom对像进行操作时,python会报错。
解决:上网一查,其实我犯了一个很蠢的自以为是的问题 Or2 上面对gb2312进行了替换只是告诉xml解析模块说:“后面的数据用的是UTF-8编码~~”,但实际上这个xml文件本身还是gb2312编码,需要对文件本身进行转编码

Data = open(sourcefile)
data = data.decode(’gb2312′).encode(’UTF-8′)
data = data.replace(’gb2312′, ‘utf-8′)
data = data.replace(’GB2312′, ‘utf-8′)
self.__xmldom = xml.dom.minidom.parseString(data)

第三个问题:Or2还是XML中中文字符引起的问题
起因:取xml节点数据时,如果文本数据为中文,获取时会报:“UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position”取出程序为

    def getXMLNodeText(self, node):
        text = ""
        if (node.hasChildNodes()):
            text = node.firstChild.data
        return text

这程序在猛禽那里没有问题,我估计是和系统的默认编码有关系,因为他用的是Linux而我用的是Windows,谁知道问题所在请指点。
解决:这次有了上两次的经验,这个问题就很好解决了,于是:
    def getXMLNodeText(self, node):
        text = ""
        if (node.hasChildNodes()):
            text = node.firstChild.data.encode(’gb2312′)
        return text

第四个问题:实现根据xmlPath获取数据的方式
起因:以前一直在用其它语言+MSXML对MSXML用得还较多,可以方便用指定一个xmlPath的方式选定一个xml节点,例如:“selectNodes(nodePath)”,而minidom只是个简单的xml解析实现,没有提供这方面的现成解决方案。
解决:自己想到用一个递归和一个循环实现根据nodePath对node的查找,但越写越糊把自己玩到递归和对nodePath的判断循环中去了,木办法,只能使用召唤术,求助令狐 Or2,本来是想能给我一个指路的想法,结果令狐给的“伪”代码基本就能用了,思路很清楚一看就明白了。
    def getNode(self, nodePath):
        nodeNameList = nodePath.split(’/')
        Node = self.findNode(self.getRootNode(), nodeNameList[0])
        if len(nodeNameList) == 1:
            return Node
        else:
            return self._internalGetNode(Node, nodeNameList[1:])

    def _internalGetNode(self, parent, nodeNameList):
        childName = self.findNode(parent, nodeNameList[0])
        if len(nodeNameList) == 1:
            return childName
        else:
            return self._internalGetNode(childName, nodeNameList[1:])

    def findNode(self, parent, nodeName):
        if parent:               
            for node in parent.childNodes:
                if node.nodeType == node.ELEMENT_NODE:
                    if node.nodeName == nodeName:
                        return node
使用时可以用 getNode("xxxx/oooo")这种path方式找到指定节点,要注意的是,root节点不要写,不要写成getNode("root/xxxx/oooo")这种形式Orz。
后记:一开始我用minidom发现“不能用”,换为使用pywin32调用msxmlCOM组件,但发现好像和Delphi操作msxml有区别,再查中文资料基本没一条能用地Orz,没办法又换回minidom,一度想用python其它xml库Orz。不过最后还是找到了解决方法。最后月亮帮我找到了python操作msxml英文的资料,虽然英文看不懂,但例程很清楚,一看就明白了。感谢大家,没有大家的帮助不会有这些成果,我也不会学到这么多。
最后要说的是以前用Delphi开发windows下简单程序基本上不会涉及编码问题,现在使用Python写程序一定要注意数据的编码问题。

放到一起:
xmlParse.py
———————–
# -*- coding: UTF-8 -*-

import urllib
import xml.dom.minidom

class xmlParse:
   
    def __init__(self):
        self.__isOpenFile = False
        
    def _openAnything(self, source):
        try:                                 
            f = urllib.urlopen(source)
            data = f.read()
            f.close()
            return data
        except (IOError, OSError):
            pass
        try:                                 
            f = open(source)
            data = f.read()
            f.close()
            return data
        except (IOError, OSError):
            pass
   
    def open(self, xmlfile):
        returnStatus = False
        try:
            data = self._openAnything(xmlfile)
            if data:
                data = data.decode(’gb2312′).encode(’UTF-8′)
                data = data.replace(’gb2312′, ‘utf-8′)
                data = data.replace(’GB2312′, ‘utf-8′)
                self.__xmldom = xml.dom.minidom.parseString(data)
                self.__isOpenFile = True
                returnStatus = True
        except Exception, e:
            print Exception, e
            returnStatus = False
        return returnStatus            
   
    def getNode(self, nodePath):
        nodeNameList = nodePath.split(’/')
        Node = self.findNode(self.getRootNode(), nodeNameList[0])
        if len(nodeNameList) == 1:
            return Node
        else:
            return self._internalGetNode(Node, nodeNameList[1:])

    def _internalGetNode(self, parent, nodeNameList):
        childName = self.findNode(parent, nodeNameList[0])
        if len(nodeNameList) == 1:
            return childName
        else:
            return self._internalGetNode(childName, nodeNameList[1:])
   
    def getXMLNodeText(self, node):
        text = ""
        try:
            if (node.hasChildNodes()):
                text = node.firstChild.data.encode("gb2312")
        except:
            pass
        return text
   
    def findNode(self, parent, nodeName):
        if parent:               
            for node in parent.childNodes:
                if node.nodeType == node.ELEMENT_NODE:
                    if node.nodeName == nodeName:
                        return node
        #return self.__xmldom.getElementsByTagName(nodeName)[0]
   
    def getRootNode(self):
        if self.__isOpenFile:
            return self.__xmldom.documentElement
        
    def getText(self, nodePath):
        return self.getXMLNodeText(self.getNode(nodePath))


转载自:http://www.go4pro.org/?p=31
最近一直纠结于此问题 现在来个彻底的学习
python中xml.dom
代表的是使用dom解析器解析xml文档
其中使用比较方便的应该是minidom库了 现在来看看他们的使用方法
使用minidom的parser后产生一个Document object 它包含了解析后的所有的xml文档的信息
view plaincopy to clipboardprint?
python xml 解析方法   
最近一直纠结于此问题 现在来个彻底的学习   
python中xml.dom  
代表的是使用dom解析器解析xml文档   
其中使用比较方便的应该是minidom库了 现在来看看他们的使用方法  
使用minidom的parser后产生一个Document object 它包含了解析后的所有的xml文档的信息  
''''' 
Created on 2010-6-24 
@author: program 
''' 
import os  
import sys  
from xml.dom import minidom  
def walkdir(dirname,node,document):  
    for file in os.listdir(dirname):  
        if os.path.isfile(os.path.join(dirname,file)):  
            docFile=document.createElement('file')  
            docFile.attributes['name']=file  
            print file  
            node.appendChild(docFile)  
        elif os.path.isdir(os.path.join(dirname,file)):  
            docFile=document.createElement('dir')  
            docFile.attributes['name']=file  
            node.appendChild(docFile)  
            walkdir(os.path.join(dirname,file),docFile,document)  
def usage():  
    print "usage:",sys.argv[0],"dirname xmlfile" 
def dir2xml(dirname):  
    impl=minidom.getDOMImplementation()  
    newdoc=impl.createDocument(None,"dir",None)  
    rootdir=newdoc.documentElement  
    rootdir.attributes['name']=os.path.basename(dirname)  
    walkdir(dirname,rootdir,newdoc)  
    return newdoc  
              
if __name__=='__main__':  
    if len(sys.argv)<3:  
        usage()  
        sys.exit()  
    if not os.path.isdir(sys.argv[1]):  
        print 'error ' 
        sys.exc_clear()  
    xmlfile=file(sys.argv[2],'w')  
    newdoc=dir2xml(sys.argv[1])  
    newdoc.writexml(xmlfile, '/n',' ')  
    xmlfile.close() 
python xml 解析方法
最近一直纠结于此问题 现在来个彻底的学习
python中xml.dom
代表的是使用dom解析器解析xml文档
其中使用比较方便的应该是minidom库了 现在来看看他们的使用方法
使用minidom的parser后产生一个Document object 它包含了解析后的所有的xml文档的信息
'''
Created on 2010-6-24
@author: program
'''
import os
import sys
from xml.dom import minidom
def walkdir(dirname,node,document):
    for file in os.listdir(dirname):
        if os.path.isfile(os.path.join(dirname,file)):
            docFile=document.createElement('file')
            docFile.attributes['name']=file
            print file
            node.appendChild(docFile)
        elif os.path.isdir(os.path.join(dirname,file)):
            docFile=document.createElement('dir')
            docFile.attributes['name']=file
            node.appendChild(docFile)
            walkdir(os.path.join(dirname,file),docFile,document)
def usage():
    print "usage:",sys.argv[0],"dirname xmlfile"
def dir2xml(dirname):
    impl=minidom.getDOMImplementation()
    newdoc=impl.createDocument(None,"dir",None)
    rootdir=newdoc.documentElement
    rootdir.attributes['name']=os.path.basename(dirname)
    walkdir(dirname,rootdir,newdoc)
    return newdoc
           
if __name__=='__main__':
    if len(sys.argv)<3:
        usage()
        sys.exit()
    if not os.path.isdir(sys.argv[1]):
        print 'error '
        sys.exc_clear()
    xmlfile=file(sys.argv[2],'w')
    newdoc=dir2xml(sys.argv[1])
    newdoc.writexml(xmlfile, '/n',' ')
    xmlfile.close()
由此可见 写入的时候需要document object 和node object

 


DOM object 可通过minidom.getDOMImplementation() function 获得
document 可通过DOM.createDocument() 获得


Node 可通过document.documentELement 获得


node object 含有attributes 属性 通过该属性可以设定很多xml节点的属性
writexml() function 则为将获得的整个信息写入xml文档中去
xmlfile 为file object

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/squall1988/archive/2010/06/24/5692187.aspx

 

python XML 操作总结(创建、保存和删除,支持utf-8和gb2312)
2010-01-01 17:19

作者:羽殇仁(Nonove)
欢迎大家多交流python啊……

2010年1月1日,新年第一帖!!!

最近写程序需要用到xml操作,看了看python.org上面的几个xml类库,还是一头雾水,感觉太学术化了,都那么吝惜写几个例子。所以自己整理了一下,算是个小总结,和大家分享一下吧。

对于简单的操作xml文件来说,xml.dom.minidom足以,可以写可以读的。

先给出示例程序,然后简单注释一下

1.示例程序:

------------------------------------------------------------------------------------------------------------------

# Author: Nonove. nonove[at]msn[dot]com
# XML simple operation Examples and functions
# encoding = gbk

from xml.dom import minidom
import codecs


def write_xml_file(path, xmlDom, option = {'encoding':'utf-8'}):
    """ Generate xml file with writer
    params:
        string path        xml file path
        Dom     xmlDom      xml dom
        dictionary option   writer option {'indent': '', 'addindent':' ', 'newl':'/n', 'encoding':'utf-8'}
    returns:
        bool                success return True else False
    """
    defaultOption = {'indent': '', 'addindent':' ', 'newl':'/n', 'encoding':'utf-8'}
    for k, v in defaultOption.iteritems():
        if k not in option:
            option[k] = v
   
    try:
        f=file(path, 'wb')
        writer = codecs.lookup(option['encoding'])[3](f)
        xmlDom.writexml(writer, encoding = option['encoding'], indent = option['indent'], /
                        addindent = option['addindent'], newl = option['newl'])
        writer.close()
        return True
    except:
        print('Write xml file failed.... file:{0}'.format(path))
        return False

 

if __name__ == "__main__":
    # Create a xml dom
    xmlDom = minidom.Document()
    nonove = xmlDom.createElement('nonove')
    xmlDom.appendChild(nonove)

    # Generate a xml dom
    # Create child node, textnode, set attribute, appendChild
    for i in range(3):
        node = xmlDom.createElement('node')
        node.setAttribute('id', str(i))
        node.setAttribute('status', 'alive')
        textNode = xmlDom.createTextNode('node value ' + str(i))
        node.appendChild(textNode)
        nonove.appendChild(node)

    # Print xml dom
    # Print simple xml
##    print(xmlDom.toxml())
    # Print pretty xml
    print('/n' + xmlDom.toprettyxml(indent=' '))
   
    # Save xml file with encoding utf-8
    option = {'indent': '', 'addindent':'', 'newl':'', 'encoding':'utf-8'}
    write_xml_file('nonove.xml', xmlDom, option)

    # Load xml dom from file
    xmlDom = minidom.parse('nonove.xml')
    # Get nonove node
    nonove = xmlDom.getElementsByTagName('nonove')[0]
    # Get node list
    nodes = xmlDom.getElementsByTagName('node')
    for node in nodes:
        # Get node attribute id
        nodeid = node.getAttribute('id')
        # Print node id and textnode value
        print('Node id: {0} textnode value: {1}'.format(nodeid, node.firstChild.nodeValue))

    for node in nodes:
        # Set attribute or remove attribute
        node.setAttribute('author', 'nonove')
        node.removeAttribute('status')

    # Remove node 1
    nonove.removeChild(nodes[1])

    print('/n' + xmlDom.toprettyxml(indent=' '))

------------------------------------------------------------------------------------------------------------------

2.注释:

#读取xml方式有两种 从文件 和 从字符串
xmlDom = minidom.parse('nonove.xml')
xmlDom = minidom.parseString(xmlstring)

#创建xml dom
主要是用到了minidom.Document()
xmlDom = minidom.Document()

#创建/删除节点
node = xmlDom.createElement('node')
root.removeChild(node)

#创建Text Node,获取 node value
textnode = xmlDom.createTextNode('set value here')
value = textnode.nodeValue

#添加/删除node属性
node.setAttribute('author', 'nonove')
node.removeAttribute('author')

#保存xml文件
用到了codecs类库和writexml()函数,例子里面我写了个函数,把略显复杂的操作封装了一下,以后可以方便重用。

       write_xml_file(path, xmlDom, option)
              path:xml文件保存地址
              xmlDom: xml document
              option: 是dictionary类型变量,包括缩进和编码等,这个可以方便的把xml文件按utf-8或者gb2312保存,方便。

3.备注:

关于CharacterData的解析不出来的问题解决办法:<![CDATA[]]>标签和两面的节点不能够有间隔字符,否则就解析为空。

<nodename><![CDATA[my data data]]></nodename>

 

就先总结了这么多,有什么不对的地方或者更好的方法请赐教啊……

转载请注明原文地址啊,辛辛苦苦的总结出来的,别人的劳动成果不容易。

..................

假设有一下xml文件:
Sample.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<policy-list>
<policy id="123456">
<group>1</group>
</policy>
</policy-list>
</configuration>

from elementtree.ElementTree as ET
如果你使用的是python2.5的话:
import xml.etree.ElementTree as ET

  • tree = ET.parse("path/to/Sample.xml")
    doc = tree.getroot()         #获得根

    元素的标签名字 : print doc.tag  #@result: configuration
    Element text: print doc.text   #@result: "/n"  如果所有元素是一行的话,结果为空

  • 子元素
    • 迭代子元素: for child in doc
      for child in doc:
          print child.tag        #@result: policy-list 自由policy-list一个子元素
    • 获得第1、2个子元素: doc[0:2]
      获得节点的子元素:elem.getchildren() 返回这个节点的子元素(list)
    • 获得名为policy-list的元素: doc.find('policy-list')
      这里需要注意,由于doc是root的元素,这里不能用doc.find("policy"),来找到policy这个节点,尽管代码不会报错,但是获得是"NoneType" object,如果你调用这个对象的方法,便会报错,比如 policy = doc.find("policy")   policy.find("group"),第一句不会报错,但是第二句就会报错,因为policy是一个NoneType object
    • append(), remove(), insert()方法
      g2 = ET.Element("group")
      g2.text = "3"
      p2 = ET.Element("policy")
      p2.set("id","122334")
      p2.append(g2)  #policy下面增加一个group节点
      policylist = doc.find("policy-list")
      policylist.append(p2) #policy-list下面增加一个policy节点
      tree.write("path/to/Sample.xml") #写入文件

      insert(index,elem) #在制定的index插入一个元素

      del elem[n] #删除第n个节点
      elem.remove(elem2) #从节点elem中删除elem2子节点
    • getiterator(tag) 返回一个列表,或者另外一个迭代对象
  • 节点的属性操作
    • 获得节点的属性key列表: policy.keys() #@result: ["id"]
    • 获得节点的属性数组: policy.items()   #@result: ["id","123456"]
    • 测试节点是否包含某个属性(NAME):
      if policy.get('NAME') is not None, or
      if 'NAME' in book.attrib
    • 获得属性 id的值:
      policy.attrib.get('id'), or
      policy.get('id')
    • 给属性赋值: policy.set('Name', 'httppolicy')
  • 保存修改后的文件 tree.write("path/to/Sample.xml")
    另外几种保存方法,上面这种保存的文件是ascii格式的,如果要保存为utf-8的,可以用这种方式,
    f = open("path/to/Sample.xml","w")
    tree.write(f,"utf-8")
  • 创建节点
    elem.makeelement(tag,attr_dict)
    example: feed = root.makeelement('feed',{'version':'0.22'})

    ET.Element(tag,attr_dict,**extra)
    policy = ET.Element("policy",{"id":"12121"})

    ET.SubElement(parent,tag,attr_dict,**extra)
    group = ET.SubElement(policy,"group")

 

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值