添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在给定的标签下将XML文件分割成多个

4 人关注

我想把一个XML文件分割成多个文件。我的工作站非常有限,只有Eclipse Mars和Xalan 2.7.1。

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

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

我怎样才能把它们变成这样呢?

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

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

1 个评论
你是在java还是python中进行分割的?
python
xml
parsing
xalan
Roger Sánchez
Roger Sánchez
发布于 2016-03-22
3 个回答
Dan-Dev
Dan-Dev
发布于 2016-03-22
已采纳
0 人赞同

Use 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 it with

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))
    
谢谢你,Dan-Dev,我编辑了一下你的代码,附加了 "root "标签。还有一个问题,我怎样才能将.xml追加到输出文件中?
我一分钟前编辑了它,现在它读作: filename = format(title + ".xml")。如果你用编辑过的代码再次运行它,应该会将文件扩展名.xml附加到你的文件上。
好了,还有一个问题。有些NAME出现了不止一次。有没有可能从例如1.xml开始迭代输出文件名?
编辑在 "或者如果名字不唯一:"之后添加了代码。
Roger Sánchez
Roger Sánchez
发布于 2016-03-22
0 人赞同

This is the code which works perfect.

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>")
    
Looks like in Python3 you need write string like this f.write(b"<root>\n") note b letter before "<root>\n"
Eugene Lisitsky
Eugene Lisitsky
发布于 2016-03-22
0 人赞同

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

鉴于你有一个 1.xml 的文件,其中的数据如上。你需要把它分割成不同的文件,名称为NNN.xml,元素为/root/row。

只需调用外壳。

    $ 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; \