python - 控制搜索深度 findall Lxml

标签 python xml xml-parsing lxml

我是Python初学者,尝试在Python中使用LXML解析XML。我正在尝试使用 Finall() 搜索标签,但希望控制深度,我可以在其中搜索标签,但搜索不会超出一个级别。解释如下:

<?xml version='1.0' encoding='utf-8'?>
<system xmlns="some_name_space">
<a>
    <host>Random Name</host>
    <class>
        <name>Main_Tag_1</name>
        <detail>
            <name>Child_Tag_1</name>
            <ip>ip_1</ip>
            <port>port_1</port>
        <detail>
    </class>
    <class>
        <name>Main_Tag_2</name>
        <detail>
            <name>Child_Tag_2</name>
            <ip>ip_2</ip>
            <port>port_2</port>
        <detail>
    </class>
    <class>
        <name>Main_Tag_3</name>
        <detail>
            <name>Child_Tag_3</name>
            <ip>ip_3</ip>
            <port>port_3</port>
        <detail>
    </class>
</a>

我正在使用以下Python来查找与名称共享相同标签名称的所有Main_tags。我这里没有添加完整的程序。但这个函数是类的一部分。

def name_ip_dict(self,filename):
self.tag_replace = {}
context = ET.iterparse(filename, tag='{some_name_space}class')
for action,elem in context:
    name_tag = elem.findall(".//{some_name_space}name")
    for name in name_tag: 
        print name.text
        for node in elem:
            ip_list = node.findall(".//{some_name_space}ip") 
            for ip in ip_node_list:
                self.tag_replace.setdefault(name.text, []).append(ip.text)

现在,我得到的输出为

{'Main_Tag_1': ['ip_1'], 'Child_tag_1': ['ip_1'], 'Main_Tag_2': ['ip_2'], 'Child_tag_1': ['ip_2']} and so on..

但我只想获取第一个父级,即 Main_Tag1,2 或 3 以及 ip 标记中的文本。

{'Main_Tag_1': ['ip_1'], 'Main_Tag_2': ['ip_2']} and so on..

这让我觉得需要控制 findall 的深度,但我一直无法在网络上找到与深度相关的任何内容。

请告诉我是否已经有此类用例以及实现此目的的最佳方法是什么。

最佳答案

如果您只想搜索直接子元素(不包括孙子元素和更深的后代元素),请使用单斜杠 (/):

name_tag = elem.findall("./{some_name_space}name")

请注意,当您需要支持更高级的 XPath 表达式时,请使用 lxmlxpath()方法而不是 findall()。后者仅支持非常limited set XPath 表达式。

关于python - 控制搜索深度 findall Lxml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34288222/

相关文章:

java - 解析器忽略的 Xml 默认属性值

python - 使用 Python-oauth2 在 python 中为 tumblr API 初始化 Oauth 客户端

iterator - 用于容器的 Itertools

html - 从两个 XML 文件中提取值并进行计算

java - 无法将项目直接加载到操作栏中

java - 在java中比较日期与Xpath

Python 情节未显示

Python Mysql, "commands out of sync; you can' t run this command now"

java - 合并 XML 文件时出错

swift - 使用 XMLParsing swift 库发布请求时出现错误 401