python xml解析例子

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 16 23:18:27 2015

@author: shifeng
"""
'''
功能:解析CDR_sample.xml文件,输出格式为DNorm接收的格式,并将训练集的“label”写入到文档中
xml文件:见CSDN资源共享
参考博客:http://www.cnblogs.com/fnng/p/3581433.html
'''
import codecs
import StringIO
import xml
from lxml import etree
from xml.sax import *
from xml.sax.handler import *
from xml.etree import ElementTree as ET
import xml.dom.minidom 

dom = xml.dom.minidom.parse("CDR_sample.xml")

root  = dom.documentElement
#print root.nodeName
#print root.nodeValue
#print root.nodeType
#print root.ELEMENT_NODE
#-----------
'''
方法一(未采纳):
#知道元素名字的子元素,使用getElementsByTagName方法获取
#colloction为根节点,有四个元素,知道其名,通过root.getElementsByTagName(i)便能取出其子元素
colloction_ele = ["source", "date", "key", "document"]
for i in colloction_ele:
    print root.getElementsByTagName(i)[0].nodeName      #获取标签名字
#    print root.getElementsByTagName(i)[0].getAttribute


#documents有三个标签
document_ele = ["id", "passage", "annotation"]
documents = root.getElementsByTagName("document")
#print len(documents)
for i in documents:                 #对每个文档,
    for j in document_ele:          #取出每个标签
        print i.getElementsByTagName(j)[0].nodeName         #获取标签名字
        print i.getElementsByTagName(j)[0].firstChild.data  #获取标签之间的数据
        if j == "annotation":
            print i.getElementsByTagName(j)[0].getAttribute("id")   #获取标签属性
'''
#-----------
write_text = open("train_text.txt","w")

#-----------
root_2 = ET.parse("CDR_sample.xml")
documents = root_2.findall("./document")
for per in documents:               #找到所有document
    for child in per:               #对于每个document解析其标签id,passage,annotation            
        child_tag = child.tag
        if child_tag =="id":                        
            text_id = child.text
            print child_tag,":",text_id
            write_text.write(text_id+"\t")                      #写入文件,id和tab符号
            
        elif child_tag =="passage":                                 #对每个passage进行处理
            passages = child
            for passage in passages:                                #每个document标签下,有多个passage标签,
                                                                    #passage有四种标签,对每种标签进行处理
                passage_tag = passage.tag
                if passage_tag == "offset":                       #r如果是偏移量,取出偏移量
                    offset = int(passage.text)          
                    print "offset:",offset
                elif passage_tag == "text":                      #如果是文本,取出文本,title_text或者abstract_text
                    text =passage.text
                    print passage_tag,"::",text
                    write_text.write(text)                       #写入文件,title_text和abstract_text两个,连续写在一起
                elif passage_tag =="annotation":                 #如果是标注的,
                    annotations = passage
                    print 10*"*"
                    for annotation in annotations:               #每个passage标签下,annotation有四种标签,对每种标签处理
                        annotation_tag = annotation.tag
#                        print annotation_tag,"+++++++++++++++++++"
                        if annotation_tag == "location":
                            print annotation.attrib["offset"],annotation.attrib["length"]
                        elif annotation_tag == "text":
                            diease_name = annotation.text
                            print diease_name
                        elif annotation_tag == "infon" and annotation.attrib["key"] !="type":
                            #每个passage标签下,有多个annotation,每个annotation下有两个infon标签,取第二个
                            infons = annotation
                            print infons.attrib["key"],infons.text
#                            for infon in infons:
#                                print infon.attrib["key"]                                
                        
        elif child_tag =="annotation":                #document_ele[2]:           #annotation
            annotation = child
    write_text.write("\n")  #每个文档遍历完一遍后,加一个换行符号
    print 30*"*"

write_text.close()
#“label”对照待续....

'''
doc = etree.parse("CDR_sample.xml")
xml_string = etree.tostring(doc)
root = etree.fromstring(xml_string)

parser = make_parser()
# MarkDecodeHandler
# MarkDecodeHandler
handler = UserDecodeHandler()
parser.setContentHandle(handler)
parser.parse(root)

for item in handler.marks:
	for j in item.items():
		print i,j



print type(doc)
print type(root)
# print doc.tag
print root.tag



# with codecs.open("CDR_sample.xml") as xml:
# 	text = xml.readlines()
# s_xml = ""
# for i in text:
# 	i=i.strip("\n")
# 	s_xml+=i
# print s_xml
# soup = BeautifulSoup(s_xml)
# print soup.title
# for i in text:
# 	print i
'''

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值