[python]使用xml.dom读写XML文件
我觉得XML可以理解成为一棵多叉树。一个根节点下,可以有多个子节点,子节点又可以看做是一个根节点继续添加子节点。每个节点上面可以有标签(可以理解为节点的一些属性)。当节点为叶子节点的时候,一般存放一串字符串,可以理解为节点的内容。
加载dom库
from xml.dom import minidom
建立节点
#建立整个文本 doc=minidom.Document() #建立普通节点 acadamic=doc.createElement("acadamic")#节点名称为acadamic #简历文本节点,也是是最底层节点 #比如 <acadamic>Automation</acadamic> # "Automation"是acadamic的子节点 doc.createTextNode("Automation")
添加子节点
#给叶子节点添加内容 acadamic.appendChild(doc.createTextNode("Automation")) #给非叶子节点添加子节点 student1.appendChild(acadamic)
添加标签
#给student这个节点添加一个标签id,值设为01 student1.setAttribute("id","01")
输出xml
f=open("f:/school.xml","w") doc.writexml(f) f.close()
最终生成
<?xml version="1.0" ?> - <!-- This is an example! --> - <studentlist> - <student id="01"> <acadamic>Automation</acadamic> <school>UESTC</school> </student> - <student id="02"> <acadamic>Communication</acadamic> <school>GDUT</school> </student> </studentlist>
-----------------------------------------------------------------------------------------------------------
读取XML
打开XML文件
doc = minidom.parse("f:/school.xml")
节点的类型:
#普通节点 Node.ELEMENT_NODE #备注节点 Node.COMMENT_NODE #文本节点 Node.TEXT_NODE #值得注意的是,TEXT_NODE虽然被包围在一个普通节点中间,但它是作为这个普通节点的唯一子节点
读取XML,除了dom以外,还要import Node
from xml.dom import minidom,Node
查看节点的标签、类型与属性与节点的值
#节点类型 if child.nodeType==Node.ELEMENT_NODE #节点标签 child.tagName=="acadamic" #节点属性 student_id=child.getAttribute("id") #节点的值,叶子节点才能直接返回值 if node.nodeType==Node.TEXT_NODE: return node.nodeValue
迭代子节点
for child in node.childNodes: if child.nodeType==Node.ELEMENT_NODE and child.tagName=="student": student_id=child.getAttribute("id") print "student id is %s\n" % student_id self.read_student(child)
由于最后的文本节点肯定是它的父节点的唯一节点,所以一般不需要迭代,直接使用firstChild
if child.nodeType==Node.ELEMENT_NODE and child.tagName=="school": print "school is %s" % self.read_text(child.firstChild)
完整代码:https://github.com/iyjhabc/study_examples/blob/master/read_xml.py