如何使用Python在多次迭代中解析和匹配多个XML文件?

2024-06-25 22:42:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个XML文件。一个文件包含防火墙规则,这些规则是使用对象定义的,而不是IP地址、服务等。第二个文件包含这些对象的定义、它们的IP地址、服务类型等

我可以使用ElementTree和以下代码轻松遍历每个XML文件并将对象与服务定义匹配:

import xml.etree.ElementTree as ET
fwPolicy = ET.parse('policy.xml')
services = ET.parse('services.xml')

rules = fwPolicy.findall('./rule')
service = services.findall('./service')

for rule in rules:
    ruleServices = rule.findall('./services/members/reference/Name') 
    for ruleService in ruleServices:
            for objService in service: 
                    objServiceName = objService.find('./Name').text 
                    if ruleService.text == objServiceName: 
                            print('Service search Found :', objServiceName)

XML File 1 policy.xml: 

<Class_Name>rule_services</Class_Name> 
  <members>
    <reference>  
        <Name>icmp-requests</Name>        
        <Table>services</Table>
    </reference>
    <reference>  
        <Name>gre</Name>       
        <Table>services</Table>
    </reference>
   </members> 
</Class_Name>



XML File 2 services.xml: 

<service>
 <Name>icmp-requests</Name>
 <Class_Name>service_group</Class_Name>
<members>
    <reference>   
        <Name>echo-request</Name>       
        <Table>services</Table>
    </reference>
    <reference>  
        <Name>info-req</Name>   
        <Table>services</Table>
    </reference>
    <reference>  
        <Name>timestamp</Name>  
        <Table>services</Table>
    </reference>
    <reference>  
        <Name>mask-request</Name>       
        <Table>services</Table>
    </reference>
 </members>
</service> 

<service>
 <Name>echo-request</Name>
 <Class_Name>icmp_service</Class_Name>
 <icmp_type>8</icmp_type>
</service> 

我的问题是策略.xml是“服务组”,其中包含我需要访问的实际服务。在示例XML中策略.xml包含“icmp请求”作为服务对象,该服务对象是中的“服务组”服务.xml. 所以,当我执行匹配时,我会针对组中的所有服务进行匹配。在

我考虑过添加一个代码来检查服务对象是否是一个服务组,然后遍历它并提取所有服务。我的问题是服务组可以包含其他服务组。实际上,嵌套的范围是没有限制的。在

最后,我需要做的是从策略.xml并将其与服务.xml. 在


Tags: 文件对象name定义servicetablexmlrule
1条回答
网友
1楼 · 发布于 2024-06-25 22:42:49

我可以通过构建以下函数来解决我的问题:

def resolve_group_members(group_name):
    # Loop through the list of members
    for member in groups[group_name]:
            # If the member is in the groups dict keys
            if member in groups.keys():
                    # recursively loop through the function again passing the member name
                    resolve_group_members(member)
            else:
                    # if the member is not a group now we can do something with it
                    print('\t\tGroup Members: ' +  member)

通过这种方式,我可以将所有服务分配给一个字典,然后解析每个组成员。在

相关问题 更多 >