万事开头难。
想要找一个例子看看如何用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