Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 - Fatal编程技术网

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

如何使用Python在多次迭代中解析和匹配多个XML文件?,python,xml,Python,Xml,我有两个XML文件。一个文件包含防火墙规则,这些规则是使用对象而不是IP地址、服务等定义的。第二个文件包含这些对象的定义、它们的IP地址、服务类型等 使用ElementTree和以下代码,我可以很容易地遍历每个XML文件并将对象与服务定义相匹配: import xml.etree.ElementTree as ET fwPolicy = ET.parse('policy.xml') services = ET.parse('services.xml') rules = fwPolicy.fin

我有两个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.etree.ElementTree作为ET导入
fwPolicy=ET.parse('policy.xml')
services=ET.parse('services.xml')
rules=fwPolicy.findall(“./rule”)
service=services.findall(“./service”)
对于规则中的规则:
ruleServices=rule.findall(“./services/members/reference/Name”)
对于ruleServices中的ruleService:
对于正在使用的objService:
objServiceName=objService.find('./Name').text
如果ruleService.text==objServiceName:
打印('找到服务搜索:',objServiceName)
XML文件1 policy.XML:
规则服务
icmp请求
服务
gre
服务
XML文件2 services.XML:
icmp请求
服务组
回显请求
服务
信息请求
服务
时间戳
服务
屏蔽请求
服务
回显请求
icmp_服务
8.
我遇到的问题是policy.xml中使用的一些对象是“服务组”,其中包含我需要访问的实际服务。在示例中,XML policy.XML包含“icmp请求”作为服务对象,它是services.XML中的“服务组”。因此,当我进行比赛时,我是在与团队对抗,而我真的需要与团队中的所有服务进行对抗

我考虑只添加一个代码来检查服务对象是否是服务组,然后在其中循环并提取所有服务。我的问题是服务组可能包含其他服务组。筑巢的距离确实没有限制


最后,我需要做的是从policy.xml中提取所有成员,并将其与services.xml的所有单个成员进行匹配

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

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)
通过这种方式,我可以将所有服务分配给一个字典,然后解析每个组成员