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

时间:2016-03-22 12:59:17

标签: 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>

如何将它们转换为这样的

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <row>
            <NAME>Doe</NAME>
            <FIRSTNAME>Jon</FIRSTNAME>
            <GENDER>M</GENDER>
        </row>
    </root>

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

3 个答案:

答案 0 :(得分:7)

使用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))

使用

运行它
python xmlsplitter.py

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

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))

答案 1 :(得分:1)

这是完美的代码。

import xml.etree.ElementTree as ET

context = ET.iterparse('filname.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("<root>\n")
        f.write(ET.tostring(elem))
        f.write("</root>")

答案 2 :(得分:1)

有一个很好的工具http://xmlstar.sourceforge.net/docs.php可以用xml做很多事情(但它不是pythonic)。

鉴于您拥有包含上述数据的1.xml文件。并且您需要将其拆分为单独的文件,名称为NNN.xml,其中包含元素/ root / row。

只需在shell中调用:

    $ for ((i=1; i<=`xmlstarlet sel -t -v 'count(/root/row)'  1.xml`; i++)); do \
          echo '<?xml version="1.0" encoding="UTF-8"?><root>' > NAME.xml;
          NAME=$(xmlstarlet sel -t -m '/root/row[position()='$i']' -v './NAME' 1.xml); \
          xmlstarlet sel -t -m '/root/row[position()='$i']' -c . -n 1.xml >> $NAME.xml; \
          echo '</root>' >> NAME.xml
       done

现在你有一堆像Joe.xml这样的xml文件