在给定标签处将 XML 文件拆分为多个
Splitting XML file into multiple at given tags
我想将一个 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>
我需要每个 "row"-数据在一个文件中 header。上面的数据只是一个例子。大部分"row"-数据有16个属性,但会不时变化。
使用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))
这是完美运行的代码。
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>")
有一个很棒的工具 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
现在您有一堆 xml 个文件,例如 Joe.xml
我想将一个 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>
我需要每个 "row"-数据在一个文件中 header。上面的数据只是一个例子。大部分"row"-数据有16个属性,但会不时变化。
使用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))
这是完美运行的代码。
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>")
有一个很棒的工具 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
现在您有一堆 xml 个文件,例如 Joe.xml