任务备忘(已经完成):用python写一个格式化xml字符串的程序

摘要:
函数:1.删除xml中多余的空格和换行符,使xml字符串成为一行。想法:使用正则表达式判断xml中字符串的类型:1.文件头2.判断元素的类型:带属性的标记、不带属性的标签、以标签结尾的标签、仅包含文本的标签和不包含文本的标记。

功能:

1.将xml中多余的空格,换行符去掉,让xml字符串变成一行。

2.将xml中添加缩进,使用print能正确打印添加缩进后的字符串。

思路:

采用正则表达式来判断xml中字符串的类型:

1.文件头

2.判断元素的种类:带有属性的标签,没有属性的标签,标签内结束的标签,只含有文本的标签,不含有文本的标签。

3.根据标签的级别添加换行符后面的空格

'
'+i*'    '

 已经完成,使用python与正则表达式。

import re
def getData(file_name):
    path="D:\Python\xml\"+file_name+".txt"
    str=''
    with open(path,'r',encoding='utf-8') as f:
        for line in f.readlines():
            str=str+line
    return str.strip()

def getSpace(level):
    space='
'
    for i in range(level):
        space=space+'    '
    return space

def printXml(xml_str):
    
    #xml_list=xml_str.split('([>])')
    new_xml_list=""
    head=xml_str[0:9]
    xml_str=xml_str[9:]
    xml_list=re.split(r'([>])',xml_str)
    xml_list = ["".join(i) for i in zip(xml_list[0::2],xml_list[1::2])]
    level=0
    for node in xml_list:
        if(re.match(r'<?xml .*version.*?>',node)):
            new_xml_list=new_xml_list+new_xml_list+node
            continue
        elif(re.match(r'<[^?^/].*[^/]>',node)):
            new_xml_list=new_xml_list+getSpace(level)+node
            level=level+1
            continue
        elif(re.match(r'</.*[^/]>',node)):
            level=level-1
            new_xml_list=new_xml_list+getSpace(level)+node
            continue
        elif(re.match(r'<[^/].*/>',node)):
            new_xml_list=new_xml_list+getSpace(level)+node
        elif(re.match(r'.+</.*[^/]>',node)):
            new_xml_list=new_xml_list+node
            level=level-1
        else:
            print(node)

    print(new_xml_list)



def main():
    xml_str=getData('1000')
    printXml(xml_str)


main()

免责声明:文章转载自《任务备忘(已经完成):用python写一个格式化xml字符串的程序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇排列组合十一个性质公式及证明,错排数公式及证明zz-rtl8188eu的linux-usb-wifi调试及驱动编译150210下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#编程中关于数据缓存的经验总结

C#编程中关于数据缓存的经验总结一直以来,我都发现程序的运行速度不够理想。通过查代码,发现程序对数据库的访问非常频繁,而且检索出来的数据量比较大。为了让程序运行快起来,我想对程序采用适当的缓存方法。我在C#尝试了5种方法进行数据缓存,具体如下:(如有遗漏,错误欢迎大家指正,欢迎提建议。)1:Session方法:此方法是针对于每个用户来的,如果用户量比较大,...

python 格式化输出

格式化输出 要理解格式化输出,就要先理解占位符 % 占位符 s 字符串 d 数字 先用占位符占位 再统一按顺序替换 name = input('请输入姓名:') age = input('请输入年龄:') job = input('请输入工作:') hobbie = input('请输入爱好:') msg = '''---------- info of...

python AES加密 ECB PKCS5

class AesEbc16:  # 按块的大小, 一块一块的加密, 明文和密文长度一样   def __init__(self):     self.key = b"123qweqqqwerqwer"  # 加密和解密用同一个秘钥, 长度为 每块的长度     self.mode = AES.MODE_ECB  # ECB加密模式, 也是默认的模式, 创...

linux下将Python环境默认更改为Python3.6

1、删除原来指向python2的软链接 1 rm -rf /usr/bin/python 2、创建新的软链接 1 ln -s /usr/bin/python3.6 /usr/bin/python 3、查看是否更改成功 python -V //若显示版本信息为python3.6,则更改成功...

知识体系库

Python 1.Python三大器:装饰器,生成器,迭代器 装饰器 : 它是Python特有的一种语法,基于闭包函数来实现的,本质也是一个函数,就是在不改变被装饰函数的源代码情况下为其增加新功能; 运用场景的话:最普遍的就是用户登入验证,然后还有记录日志,验证函数参数 : 简单举个例子,比如有一个输入年龄的参数, 年龄必须是正整数,那么我们就可以写一个装...

2.变量

变量 变量的组成 变量的组成分为以下三个部分: 变量名:变量名用来引用变量值,但凡需要用变量值,都需要通过变量名。 赋值符号:赋值 变量值:存放数据,用来记录现实世界中的某种状态。 变量的命名应该满足以下三个规范: 变量的命名应该能反映变量值所描述的状态,切记不可用中文 变量名必须用字母数字下划线组合,并且变量名的第一个字符不能是数字。 关键字不能声...