2016-06-22 18 views
1

ディレクトリ内のmutilpe xmlファイルを単一のxmlファイルにマージする必要があります。以下は、私が達成しようとしているかの説明です:mutiple xmlファイルをマージし、各xmlファイルの共通ルート要素をマージしたファイルのルートに設定します

のxml-1:

<?xml version="1.0" encoding="UTF-8"?> 
<products> 
     <product> 
      <id>0569054</id> 
      <ProviderName>John</ProviderName> 
     </product> 
</products> 

のxml-2

<?xml version="1.0" encoding="UTF-8"?> 
<products> 
    <product> 
     <id>1002363</id> 
     <ProviderName>Paul</ProviderName> 
    </product> 
</products> 

は、出力をマージ:

<?xml version="1.0" encoding="UTF-8"?> 

<products> 
     <product> 
      <id>0569054</id> 
      <ProviderName>John</ProviderName> 
     </product> 
     <product> 
      <id>1002363</id> 
      <ProviderName>Paul</ProviderName> 
     </product> 
</products> 

これは、 Javaコード、私はしようとしています: 編集:はStAXで試しました。ここで製品を削除するためにここに追加する必要があるのは何ですか?これを実装するためにStaxを今日通った、訂正のアドバイスも大歓迎です。

File dir = new File("/opt/dev/common"); 
File[] rootFiles = dir.listFiles(); 

Writer outputWriter = new FileWriter("mergedFile1.xml"); 
XMLOutputFactory xmlOutFactory = XMLOutputFactory.newFactory(); 
XMLEventWriter xmlEventWriter = xmlOutFactory.createXMLEventWriter(outputWriter); 
XMLEventFactory xmlEventFactory = XMLEventFactory.newFactory(); 

xmlEventWriter.add(xmlEventFactory.createStartDocument()); 
xmlEventWriter.add(xmlEventFactory.createStartElement("", null, "products")); 
XMLInputFactory xmlInFactory = XMLInputFactory.newFactory(); 
for (File rootFile : rootFiles) { 
    XMLEventReader xmlEventReader = xmlInFactory.createXMLEventReader(new StreamSource(rootFile)); 
    XMLEvent event = xmlEventReader.nextEvent(); 

    while (event.getEventType() != XMLEvent.START_ELEMENT) { 
     event = xmlEventReader.nextEvent(); 
    } 

    do { 
     xmlEventWriter.add(event); 
     event = xmlEventReader.nextEvent(); 
    } while (event.getEventType() != XMLEvent.END_DOCUMENT); 
    xmlEventReader.close(); 
} 

xmlEventWriter.add(xmlEventFactory.createEndElement("", null, "products")); 
xmlEventWriter.add(xmlEventFactory.createEndDocument()); 

xmlEventWriter.close(); 
outputWriter.close(); 
+0

私はSTAXで試してみる必要があるだろう:https://docs.oracle.com/javase/tutorial/jaxp/stax/using.html – Fildor

+0

@Fildorを - スタックスにしようと、上記のコードを編集しました。あなたは要素を削除するために必要な実装に関するアドバイスをお願いしますか? – ani0710

答えて

1

Javaでそれをやっては非常に簡単で、まっすぐ進む...以下VTD-XMLに基づいてファイルをマージするためのコードであるのです。基本的に開始タグと終了タグを除いたバイトを追加しています。あなたがファイルを開き、マウスポインタを使ってテキストのセクションを強調表示し、それを出力テキストエディタに貼り付けると想像してみてください。

import com.ximpleware.*; 
import java.io.*; 

public class simpleMerge { 
    static VTDGen vg = new VTDGen(); 
    public static void main(String[] s) throws VTDException,IOException{ 
     FileOutputStream fos = new FileOutputStream("d:\\xml\\o.xml"); 
     // write header to 
     byte[] header=("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+ 
     "<products>").getBytes(); 
     fos.write(header); 
     appendSingleFile("d:\\xml\\xml-1.xml",fos); 
     appendSingleFile("d:\\xml\\xml-2.xml",fos); 
     fos.write("</products>".getBytes()); 

    } 
    // write everything under root into output efficiently, ie. direct byte copying 
    public static void appendSingleFile(String fileName,FileOutputStream fos) throws VTDException,IOException{ 
     if (!vg.parseFile(fileName, false)){ 
      System.out.println("invalid file:"+fileName); 
      System.exit(1); 
     } 
     VTDNav vn = vg.getNav(); 
     long l = vn.getContentFragment(); 
     fos.write(vn.getXML().getBytes(),(int)l,(int)(l>>32)); 
     vg.clear(); 
    } 
} 
+0

これはテストしていません。しばらくテストします。しかし、XMLは2つのファイルに限定されません。ファイルは複数あり、100を超えることができます。このコードは同じものをサポートしますか? – ani0710

+0

それは2つのファイルで動作するようにテストされています...あなたは、これらの100個のファイルをすべてプロシージャに流し込む必要があります。たぶんwhileループで...うまくいくでしょう。 –

+0

ありがとう!できます。 – ani0710

1

あなたは本当にJavaでこれをしたくありません。 XSLT 2.0では、それは

<xsl:template name="main"> 
    <products> 
    <xsl:copy-of select="collection('file://mydir')/*/*"/> 
    </products> 
</xsl:template> 
+0

ありがとう! XSLTに詳しいことはありません。これは緊急です、近い将来、私は試してみましょう。 – ani0710

+0

それが緊急であるほど、仕事のために設計された技術を使用することが重要になります。 –

関連する問題