在给定标签处将XML文件拆分为多个

Rog*_*hez 2 python xml parsing xalan

我想将XML文件拆分成多个文件.我的工作站非常受限于带有Xalan 2.7.1的Eclipse Mars.

我也可以使用Python,但以前从未使用过它.

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <row>
        <NAME>Doe</NAME>
        <FIRSTNAME>Jon</FIRSTNAME>
        <GENDER>M</GENDER>
    </row>
    <row>
        <NAME>Mustermann</NAME>
        <FIRSTNAME>Max</FIRSTNAME>
        <GENDER>M</GENDER>
    </row>
</root>
Run Code Online (Sandbox Code Playgroud)

我怎样才能将它们变换为这样

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <row>
            <NAME>Doe</NAME>
            <FIRSTNAME>Jon</FIRSTNAME>
            <GENDER>M</GENDER>
        </row>
    </root>
Run Code Online (Sandbox Code Playgroud)

我需要在带有标题的单个文件中的每个"行"数据.上面的数据只是一个例子.大多数"行"数据都有16个属性,但它会不时变化.

Dan*_*Dev 8

使用Python ElementTree.

创建一个文件,例如xmlsplitter.py.添加下面的代码(其中file.xml是您的xml文件,并假设每一行都有一个唯一的NAME元素.).

import xml.etree.ElementTree as ET
context = ET.iterparse('file.xml', events=('end', ))
for event, elem in context:
    if elem.tag == 'row':
        title = elem.find('NAME').text
        filename = format(title + ".xml")
        with open(filename, 'wb') as f:
            f.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
            f.write(ET.tostring(elem))
Run Code Online (Sandbox Code Playgroud)

运行它

python xmlsplitter.py
Run Code Online (Sandbox Code Playgroud)

或者,如果名称不是唯一的:

import xml.etree.ElementTree as ET
context = ET.iterparse('file.xml', events=('end', ))
index = 0
for event, elem in context:
    if elem.tag == 'row':
        index += 1
        filename = format(str(index) + ".xml")
        with open(filename, 'wb') as f:
            f.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
            f.write(ET.tostring(elem))
Run Code Online (Sandbox Code Playgroud)