如何将xml文件拆分为具有正确文件名的文件?

时间:2014-09-02 21:16:05

标签: python grep cat

我目前正在生成由数百个格式良好的svg文件组成的 all.xml (约2GB)。

为了简化,我有类似的东西:

<svg width="100" height="100">
    <metadata title="Cambodia"></metadata>
    <geodata WEST="102.1" NORTH="14.7" EAST="107.8" SOUTH="10.3"></geodata>
    <rect id="rectangle1" x="10" y="10" width="80" height="80" style="fill: purple;"></rect>
</svg>
<svg width="100" height="100">
    <metadata title="France"></metadata>
    <geodata WEST="-5" NORTH="51" EAST="10" SOUTH="41"></geodata>
    <rect id="rectangle1" x="10" y="10" width="80" height="80" style="fill: blue;"></rect>
</svg>
<svg width="100" height="100">
    <metadata title="Italy"></metadata>
    <geodata WEST="8" NORTH="46" EAST="18" SOUTH="35"></geodata>
    <rect id="rectangle1" x="10" y="10" width="80" height="80" style="fill: green;"></rect>
</svg>
...

我想获取每个svg元素及其标题,以便我可以将其打印到根据title的值命名的文件,例如Cambodia-map.svgFrance-map.svg和{{ 1}}。

如何从all.xml和&amp ;; grep每个svg各自的头衔价值?

然后很容易打印到以下文件中:

Italy-map.svg

2 个答案:

答案 0 :(得分:2)

使用python:

import xml.etree.ElementTree as ET
context = ET.iterparse('all.xml', events=('end', ))
for event, elem in context:
    if elem.tag == 'svg':
        title = elem.find('metadata').attrib['title']
        filename = '{}-map.svg'.format(title)
        with open(filename, 'wb') as f:
            f.write(ET.tostring(elem))

答案 1 :(得分:1)

您可以使用xml.etree.ElementTree模块解析XML(我假设data是保存XML的变量。您可以使用{{1}直接从all.xml读取}):

ET.parse()

打印

>>> import xml.etree.ElementTree as ET
>>> root = ET.fromstring(data)
>>> for svg_ele in root.iter('svg'):
...     print svg_ele.find('metadata').get('title')
...

一旦你有了这个,就可以更容易地在文件中获得上述信息:

Cambodia
France
Italy