Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中构建通用XML解析器?_Python_Xml_Parsing_Elementtree_Celementtree - Fatal编程技术网

在Python中构建通用XML解析器?

在Python中构建通用XML解析器?,python,xml,parsing,elementtree,celementtree,Python,Xml,Parsing,Elementtree,Celementtree,我是一个新手,有一周编写python脚本的经验 我正在尝试编写一个通用解析器(用于我未来所有工作的库),它解析任何输入XML,而不需要事先了解标记 解析输入XML 从XML中获取值,并根据标记设置值 在作业的其余部分使用这些值 我正在使用“xml.etree.ElementTree”库,并且能够以下面提到的方式解析xml #!/usr/bin/python import os import xml.etree.ElementTree as etree import logging lo

我是一个新手,有一周编写python脚本的经验

我正在尝试编写一个通用解析器(用于我未来所有工作的库),它解析任何输入XML,而不需要事先了解标记

  • 解析输入XML
  • 从XML中获取值,并根据标记设置值
  • 在作业的其余部分使用这些值
我正在使用“xml.etree.ElementTree”库,并且能够以下面提到的方式解析xml

#!/usr/bin/python

import os
import xml.etree.ElementTree as etree
import logging


logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

logger.info('start reading XML property file')
filename = "mood_ib_history_parameters_DEV.xml"

logger.info('getting the current location')
__currentlocation__ = os.getcwd()
__fullpath__ = os.path.join(__currentlocation__,filename)

logger.info('start parsing the XML property file')
tree = etree.parse(__fullpath__)
root = tree.getroot()

hive_db = root.find("hive_db").text
EDGE_HIVE_CONN = root.find("EDGE_HIVE_CONN").text
target_dir = root.find("target_dir").text
to_email_alias = root.find("to_email_alias").text
to_email_cc = root.find("to_email_cc").text
from_email_alias = root.find("from_email_alias").text
dburl = root.find("dburl").text
SQOOP_EDGE_CONN = root.find("SQOOP_EDGE_CONN").text
user_name = root.find("user_name").text
password = root.find("password").text
IB_log_table = root.find("IB_log_table").text
SR_DG_master_table = root.find("SR_DG_master_table").text
SR_DG_table = root.find("SR_DG_table").text

logger.info('Hive DB %s', hive_db)
logger.info('Hive DB %s', hive_db)
logger.info('Edge Hive Connection %s', EDGE_HIVE_CONN)
logger.info('Target Directory %s', target_dir)
logger.info('To Email address %s', to_email_alias)
logger.info('CC Email address %s', to_email_cc)
logger.info('From Email address %s', from_email_alias)
logger.info('DB URL %s',dburl)
logger.info('Sqoop Edge node connection %s',SQOOP_EDGE_CONN)
logger.info('Log table name %s',IB_log_table)
logger.info('Master table name %s',SR_DG_master_table)
logger.info('Data governance table name %s',SR_DG_table)
现在的问题是,如果我想在不知道标记和元素的情况下解析XML,并使用这些值,那么我该怎么做呢。我已经阅读了多个教程,但它们都通过使用下面的标记来帮助我解析XML

SQOOP_EDGE_CONN = root.find("SQOOP_EDGE_CONN").text

有人能给我指出一个正确的教程、库或代码片段来动态解析XML吗。

我认为官方文档非常清晰,包含一些示例:

您需要实现的主要部分是子节点上的循环(可能是递归的):


解析很简单-
etree.parse(path)

一旦使用
tree.getroot()
获得了根目录,就可以使用Python的“in”在树上迭代:

然后,要查看这些
子节点的标记,您可以执行相同的技巧。

这使您可以查看XML中的所有标记,而不必知道标记名

您是否需要
解析
-从xml文件创建etree?或者
搜索
-在etree中查找元素<代码>etree
具有除查找以外的其他功能。
for child in root:
    # child.tag contains the tag name, child.attrib contains the attributes
    print(child.tag, child.attrib)
for child_node in tree.getroot():
   print child_node.text