使用: Shell脚本
请帮助转换一个文件如下所示,到一个YAML格式,这将作为var文件使用的ansible攻略。
file:(它实际上是一个XML,我修剪了页眉/页脚,只过滤了所需的行)
<elementType>steering-pool</elementType>
<attribute>
<name>ip-address</name>
<value>10.10.10.12</value>
</attribute>
<attribute>
<name>start-port</name>
<value>60</value>
</attribute>
<attribute>
<name>end-port</name>
<value>100</value>
</attribute>
<elementType>steering-pool</elementType>
<attribute>
<name>ip-address</name>
<value>10.10.10.13</value>
</attribute>
<attribute>
<name>start-port</name>
<value>70</value>
</attribute>
<attribute>
<name>end-port</name>
<value>100</value>
</attribute>
<elementType>steering-pool</elementType>
<attribute>
<name>ip-address</name>
<value>10.10.10.14</value>
</attribute>
<attribute>
<name>start-port</name>
<value>80</value>
</attribute>
<attribute>
<name>end-port</name>
<value>100</value>
</attribute>元素的数量可能会有所不同,例如,上面的文件有三个元素,每个元素都有ip-address、start-port、end-port。
我正在努力地将这些信息写入如下数组中。
steering-pool:
ip-address:10.10.10.12 start-port:60 end-port:100
ip-address:10.10.10.13 start-port:70 end-port:100
ip-address:10.10.10.14 start-port:80 end-port:100请建议我可以使用的最好的方法来将其转换为上面所示的输出。
提前谢谢。
发布于 2020-02-25 11:44:26
这是我的方法,但是由于每个“元素”没有被组合到一个XML元素中,所以它不会以您想要的方式工作。您已经提到,您已经删除了一些行,这些行可能有助于产生更好的解决方案。
我将所有内容都封装在一个'data‘元素中,这是使其成为有效的XML文档所必需的。
<?xml version="1.0"?>
<data>
<elementType>steering-pool</elementType>
<attribute>
<name>ip-address</name>
<value>10.10.10.12</value>
</attribute>
...
</data>然后,您可以使用此脚本解析XML并将YAML文件打印到stdout。这种方法是可行的,但是当属性名称被重用时,这些值会被覆盖。
#!/usr/bin/env python
import yaml
import xml.etree.ElementTree
tree = xml.etree.ElementTree.parse('file.xml')
root = tree.getroot()
data = {'steering-pool': []}
d = {}
for attribute in root.findall('attribute'):
d[attribute.find('name').text] = attribute.find('value').text
data['steering-pool'].append(d)
print(yaml.safe_dump(data, default_flow_style=False))输出:
$ python parse.py
steering-pool:
- end-port: '100'
ip-address: 10.10.10.14
start-port: '80'https://stackoverflow.com/questions/60386776
复制相似问题