您的位置:首页 > 编程语言 > Python开发

使用Python库ElementTree解析Hadoop的xml配置文件

2016-11-01 15:38 477 查看
一:Hadoop 的配置文件格式如下
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://gz-lingshu-cdn-cc01</value>
</property>
....
</configuration>


如果用json来表达,格式如下
[
{
"name": "fs.default.name",
"value": "hdfs://HDFS_DEFAULT_NAME_TAG",
"description": "Deprecated. Use (fs.defaultFS) property instead"
},
....
]


可见,配置文件整体是一个数组结构,每个数组元素是一个key-Value的字典表。
所以,只需要依次读出每个xml项,再遍历这个项下所有的子项,并获取子项的Tag和Value。
每个子项的Tag和Value可以存储在字典里,把所有子项再存储在数组里。

二、编码如下
可以使用xml.etree.ElementTree模块,该模块的详细介绍如下:
https://docs.python.org/2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree
#-*- coding:utf-8 -*-
import json
from xml.etree import ElementTree as ET

xmlfile = "/etc/hadoop/core-site.xml"
etobj = ET.parse(xmlfile)
# parse 方法返回一个ElementTree Objects,该object的其他方法详细介绍如下:
# https://docs.python.org/2/library/xml.etree.elementtree.html#elementtree-objects 
property_list = etobj.findall("/property")
# findall 方法返回的也是一个elements列表,每一个列表的元素都是Element Objects,详细介绍Element Objects如下:
# https://docs.python.org/2/library/xml.etree.elementtree.html#element-objects xmldata = []
for property in property_list:


property_dict = {}

for child in property.getchildren():


# 从官方看,这个方法在2.7之后不建议使用,建议使用list方法直接读取,官方原文:


# Deprecated since version 2.7: Use list(elem) or iteration.


# 那么上面这个for语句可以这样写


# for child in list(property):


property_dict[child.tag] = child.text


xmldata.append(property_dict)


print json.dumps(xmldata)


代码运行结束后将输出json格式的配置文件,xml中的注释自然丢失了。
这里没有考虑到tag有属性值的情况,因为Hadoop的配置文件中tag是没有属性的,如果xml中的tag有属性,那么就不能直接转换为json了。
如果要转换为json,需要单独为属性创建一个数据结构并将属性值存储进去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python hadoop