我有一个用objectify解析的xml对象:
<sources>
<source type="IP">
<id>1000</id>
<ip_address>100.100.1.11</ip_address>
<netmask>255.255.255.255</netmask>
<cidr>32</cidr>
</source>
</sources>
我想用一个“/”添加IP地址值,并将cider作为字符串添加到带有以下代码的列表中:
if source.get('type') == 'IP':
source_lst.append(source.ip_address.text)+'/'+str(source.cidr)
我返回一个列表,其中包含对xml
对象的引用,而不是字符串列表。当我使用以下代码打印列表中的对象时:
for x in i.sources:
print x
我一无所获。但是etree.tostring
:
for x in i.sources:
print etree.tostring(x)
它显示了完整的XML对象:
<source xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" type="IP"><id>989</id><ip_address>100.100.1.10</ip_address><netmask>255.255.255.255</netmask><cidr>32</cidr></source>
如果我只是在代码中将text属性添加为字符串,为什么我的代码会添加完整的XML对象?
根据我得到的评论,我决定更改代码,但我没有提供我期望的结果。
sources = access_request.sources.findall('source')
for source in sources:
if source.get('type') == 'IP':
ip_address = source.ip_address.text
cidr = source.cidr.text
my_string = ip_address+'/'+cidr
print my_string
source_lst.append(my_string)
使用“print mystring”我得到这一行:
100.100.1.10/32
但是当我尝试从列表中打印项目时,我仍然得到xml对象而不是字符串。
我发现了问题。它不是代码的这一部分。 问题可以删除。
答案 0 :(得分:1)
我没有回答为什么你的代码不起作用,因为它不是一个完整的例子。但我相信您希望从示例XML构建ipaddr/cidr
字符串列表。以下是一些lxml
代码,用于扫描源记录并将其作为ipadd/cidr
字符串附加到列表中:
Python代码:
from lxml import etree
source_lst = []
sources = etree.fromstring(my_xml)
for source in sources.findall("source[@type='IP']"):
ip_address = source.findtext('ip_address')
cidr = source.findtext('cidr')
source_lst.append(ip_address + '/' + cidr)
print(source_lst)
示例数据:
my_xml = """
<sources>
<source type="IP">
<id>1000</id>
<ip_address>100.100.1.11</ip_address>
<netmask>255.255.255.255</netmask>
<cidr>32</cidr>
</source>
<source type="IPx">
<id>1000</id>
<ip_address>100.100.1.12</ip_address>
<netmask>255.255.255.0</netmask>
<cidr>24</cidr>
</source>
<source type="IP">
<id>1000</id>
<ip_address>100.100.1.13</ip_address>
<netmask>255.255.255.0</netmask>
<cidr>24</cidr>
</source>
</sources>
"""
<强>打印强>
['100.100.1.11/32', '100.100.1.13/24']