极化 通俗易懂解释的解释什么是CDN

如何用Python输出漂亮的xml文件
如何用Python输出漂亮的xml文件
发布时间: 1:02:26
编辑:www.fx114.net
本篇文章主要介绍了"如何用Python输出漂亮的xml文件",主要涉及到如何用Python输出漂亮的xml文件方面的内容,对于如何用Python输出漂亮的xml文件感兴趣的同学可以参考一下。
最近要用python处理一个xml文件。平时习惯了用xml.etree.ElementTree,结果发现此库存在一些让人无法忍受的缺点:
1. 无法处理comment和cdata
2. 输出后的xml文件没有换行,没有缩进,十分难以阅读
于是尝试这用xml.dom.minidom,前两个问题几乎全部解决了。唯一让人看着不爽的是minidom对于text的处理。比如,我期待的xml输入如下:
&pre name=&code& class=&html&&&pre name=&code& class=&html&&&root&
&host&192.168.0.1&/host&
但是使用xml.dom.minidom.Document.writexml后,输出的结果却是这样的:
192.168.0.1
开始的时候,我考虑重写Document.writexml函数,觉得太麻烦,有用牛刀杀鸡之感。后来想想,其实自己的需求非常简单,只是需要对Document的输出结果做个二次处理即可。使用python的正则表达式库就可以实现:
def save_xml(self, file_name):
xml_str = self.m_dom.toprettyxml(indent=&
repl = lambda x: &&%s&/& % x.group(1).strip() if len(x.group(1).strip()) != 0 else x.group(0)
pretty_str = re.sub(r'&\n\s*([^&]+)&/', repl, xml_str)
open(file_name, 'w').write(pretty_str)
先将Document输出到字符串,然后使用正则表达式将text中的空行去掉即可。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:Posts - 272,
Articles - 1,
Comments - 2709
大人不华,君子务实。
23:43 by 虫师, ... 阅读,
  关于读取文章很多,但大多文章都是贴一个文件,然后再贴个处理文件的代码。这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用来读取文件。
xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
&?xml version="1.0" encoding="utf-8"?&
&maxid&4&/maxid&
&login username="pytest" passwd='123456'&
&caption&Python&/caption&
&item id="4"&
&caption&测试&/caption&
&item id="2"&
&caption&Zope&/caption&
&/catalog&
Ok&,从结构上,它很像我们常见的HTML超文本标记语言。但他们被设计的目的是不同的,被设计用来显示数据,其焦点是数据的外观。它被设计用来传输和存储数据,其焦点是数据的内容。
那么它有如下特征:
首先,它是有标签对组成,&aa&&/aa&
标签可以有属性:&aa&id=&123&&&/aa&
标签对可以嵌入数据:&aa&abc&/aa&
标签可以嵌入子标签(具有层级关系):
&&&&&&bb&&/bb&
获得标签属性
那么,下面来介绍如何用python来读取这种类型的文件。
#coding=utf-8
xml.dom.minidom
#打开xml文档
dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象
root = dom.documentElement
print root.nodeName
print root.nodeValue
print root.nodeType
print root.ELEMENT_NODE
mxl.dom.minidom&模块被用来处理xml文件,所以要先引入。
xml.dom.minidom.parse()&用于打开一个文件,并将这个文件对象变量。
documentElement&用于得到dom对象的文档元素,并把获得的对象给
每一个结点都有它的nodeName,nodeValue,nodeType属性。
nodeName为结点名字。
nodeValue是结点的值,只对文本结点有效。
nodeType是结点的类型。catalog是ELEMENT_NODE类型
现在有以下几种:
'ATTRIBUTE_NODE''CDATA_SECTION_NODE''COMMENT_NODE''DOCUMENT_FRAGMENT_NODE''DOCUMENT_NODE''DOCUMENT_TYPE_NODE''ELEMENT_NODE''ENTITY_NODE''ENTITY_REFERENCE_NODE''NOTATION_NODE''PROCESSING_INSTRUCTION_NODE''TEXT_NODE'
NodeTypes&-&有名常数
获得子标签
现在要获得catalog的子标签以的标签name
&?xml version="1.0" encoding="utf-8"?&
&maxid&4&/maxid&
&login username="pytest" passwd='123456'&
  &caption&Python&/caption&
&item id="4"&
&caption&测试&/caption&
&item id="2"&
&caption&Zope&/caption&
&/catalog&
对于知道元素名字的子元素,可以使用getElementsByTagName方法获取:
#coding=utf-8
xml.dom.minidom
#打开xml文档
dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象
root = dom.documentElement
bb = root.getElementsByTagName('maxid')
print b.nodeName
bb = root.getElementsByTagName('login')
print b.nodeName
如何区分相同标签名字的标签:
&?xml version="1.0" encoding="utf-8"?&
&maxid&4&/maxid&
&login username="pytest" passwd='123456'&
  &caption&Python&/caption&
&item id="4"&
&caption&测试&/caption&
&item id="2"&
&caption&Zope&/caption&
&/catalog&
&caption&和&item&标签不止一个如何区分?
#coding=utf-8
xml.dom.minidom
#打开xml文档
dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象
root = dom.documentElement
bb = root.getElementsByTagName('caption')
print b.nodeName
bb = root.getElementsByTagName('item')
print b.nodeName
root.getElementsByTagName('caption')&获得的是标签为一组标签,b[0]表示一组标签中的第一个;,表示这一组标签中的第三个。
获得标签属性值
&?xml version="1.0" encoding="utf-8"?&
&maxid&4&/maxid&
&login username="pytest" passwd='123456'&
  &caption&Python&/caption&
&item id="4"&
&caption&测试&/caption&
&item id="2"&
&caption&Zope&/caption&
&/catalog&
&login&和&item&标签是有属性的,如何获得他们的属性?
#coding=utf-8
xml.dom.minidom
#打开xml文档
dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象
root = dom.documentElement
itemlist = root.getElementsByTagName('login')
item = itemlist[0]
un=item.getAttribute("username")
pd=item.getAttribute("passwd")
ii = root.getElementsByTagName('item')
i1 = ii[0]
i=i1.getAttribute("id")
i2 = ii[1]
i=i2.getAttribute("id")
getAttribute方法可以获得元素的属性所对应的值。
获得标签对之间的数据
&?xml version="1.0" encoding="utf-8"?&
&maxid&4&/maxid&
&login username="pytest" passwd='123456'&
  &caption&Python&/caption&
&item id="4"&
&caption&测试&/caption&
&item id="2"&
&caption&Zope&/caption&
&/catalog&
&caption&标签对之间是有数据的,如何获得这些数据?
获得标签对之间的数据有多种方法,
#coding=utf-8
xml.dom.minidom
#打开xml文档
dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象
root = dom.documentElement
cc=dom.getElementsByTagName('caption')
print c1.firstChild.data
print c2.firstChild.data
print c3.firstChild.data
firstChild&属性返回被选节点的第一个子节点,.data表示获取该节点人数据。
#coding=utf-8
from xml.etree import ElementTree as ET
per=ET.parse('abc.xml')
p=per.findall('./login/item')
for oneper in p:
for child in oneper.getchildren():
print child.tag,':',child.text
p=per.findall('./item')
for oneper in p:
for child in oneper.getchildren():
print child.tag,':',child.text
方法二有点复杂,所引用模块也与前面的不一样,findall用于指定在哪一级标签下开始遍历。
getchildren方法按照文档顺序返回所有子标签。并输出标签名()和标签的数据()
其实,方法二的作用不在于此,它核心功能是可以遍历某一级标签下的所有子标签。8713人阅读
Python(7)
config.xml文件如下:
&?xml version=&1.0& standalone=&yes& ?&
&CONFIG_LIST&
&&COMP NAME=&oracle.assistants.netca.client& VER=&11.2.0.1.0& PLAT=&NT_X86&&
&&& &path value=&/opt/imap/lib& /&
&&& &path value=&/opt/imap/med/lib1& /&
&&& &path value=&/opt/imap/med/lib2& /&
&&& &path value=&/opt/imap/med/lib3& /&
&&& &path value=&/opt/imap/med/lib4& /&
&/CONFIG_LIST&
1、读xml文件
# -*- coding: gb18030 -*-
#获取 path下得value属性集合,并进行替换
def get_tagname():
from xml.dom.minidom import parse, parseString
doc = parse(&f:\\config.xml&)
for node in doc.getElementsByTagName(&path&):
value_str = node.getAttribute(&value&)
if value_str.find(&/med/&)&0:
print value_str.replace('/opt/imap/',&/opt/oss/&)
print value_str
get_tagname()
2、生成xml文件
# -*- coding: gb18030 -*-
#生成xml文件
def GenerateXml():
import xml.dom.minidom
impl = xml.dom.minidom.getDOMImplementation()
dom = impl.createDocument(None, 'CONFIG_LIST', None)
root = dom.documentElement
employee = dom.createElement('COMP')
root.appendChild(employee)
nameE=dom.createElement('path')
nameT=dom.createTextNode('linux')
nameE.appendChild(nameT)
nameE.setAttribute(&value&,&aaaaaaaaaaa&) #增加属性
employee.appendChild(nameE)
f= open('f:\\config_new.xml', 'a')
dom.writexml(f, addindent='
', newl='\n')
GenerateXml()
生成的config_new.xml如下:
&?xml version=&1.0& ?&
&CONFIG_LIST&
&&& &path value=&aaaaaaaaaaa&&
&&&&& linux
&&& &/path&
&/CONFIG_LIST&&&&&&&&&&&&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43220次
排名:千里之外
原创:43篇
(2)(3)(13)(25)使用Python处理XML_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
使用Python处理XML
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢> 博客详情
from xml.dom import minidom & doc = minidom.Document() doc.appendChild(doc.createComment("This is a simple xml.")) booklist = doc.createElement("booklist") doc.appendChild(booklist) & def addBook(newbook): & & book = doc.createElement("book") & & book.setAttribute("id", newbook["id"]) & & & & & title = doc.createElement("title") & & title.appendChild(doc.createTextNode(newbook["title"])) & & book.appendChild(title) & & & & & author = doc.createElement("author") & & name = doc.createElement("name") & & firstname = doc.createElement("firstname") & & firstname.appendChild(doc.createTextNode(newbook["firstname"])) & & lastname = doc.createElement("lastname") & & lastname.appendChild(doc.createTextNode(newbook["lastname"])) & & name.appendChild(firstname) & & name.appendChild(lastname) & & author.appendChild(name) & & book.appendChild(author) & & & & & pubdate = doc.createElement("pubdate") & & pubdate.appendChild(doc.createTextNode(newbook["pubdate"])) & & book.appendChild(pubdate) & & & & & booklist.appendChild(book) & addBook({"id":"1001","title":"An apple","firstname":"Peter","lastname":"Zhang","pubdate":""}) addBook({"id":"1002","title":"Love","firstname":"Mike","lastname":"Li","pubdate":""}) addBook({"id":"1003","title":"Steve.Jobs","firstname":"Tom","lastname":"Wang","pubdate":""}) addBook({"id":"1004","title":"Harry Potter","firstname":"Peter","lastname":"Cheng","pubdate":""}) & f = file("book.xml","w") doc.writexml(f) f.close()
人打赏支持
码字总数 12201
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥

我要回帖

更多关于 通俗易懂 的文章

 

随机推荐