2016-03-22 40 views
1

XMLファイルを複数のファイルに分割したい。私のワークステーションは、Xalan 2.7.1のEclipse Marsに非常に限定されています。XMLファイルを複数のタグに分割する

私はPythonを使うこともできますが、これまでに使ったことはありません。私は、ヘッダーを持つ単一のファイル内のすべての「行」 - データを必要とするこの

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
     <row> 
      <NAME>Doe</NAME> 
      <FIRSTNAME>Jon</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> 
    <row> 
     <NAME>Mustermann</NAME> 
     <FIRSTNAME>Max</FIRSTNAME> 
     <GENDER>M</GENDER> 
    </row> 
</root> 

。上記のデータは単なる例です。ほとんどの「行」データには16の属性がありますが、時々刻々と変化します。

+0

のようなxmlファイルの束を持っているあなたは、JavaやPythonで分割をやっていますか? –

答えて

5

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

ありがとうDan-Dev コードを少し編集して "root"タグを追加しました。 1つの質問より、出力ファイルに.xmlを追加するにはどうすればよいですか? –

+0

1分前に編集しました:filename = format(title + ".xml")。編集したコード –

+0

でもう一度実行するとファイル拡張子.xmlをファイルに追加する必要があります。一部のNAMEは複数回出現します。例えばファイル名で始まる出力ファイル名を反復することは可能ですか? 1.xml? –

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>") 
+1

が見えます" –

1

がXMLで多くのことを行うことができます優れたツールhttp://xmlstar.sourceforge.net/docs.phpあります(ただしそれはニシキヘビではありません)。

上記のデータを持つ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; \ 
      echo '</root>' >> NAME.xml 
     done 

今、あなたはJoe.xml

関連する問題