2012-04-11 179 views
0

我一直堅持如何組合兩個不同的XML文件(它具有相同的結構)。當我對它做一些研究時,人們會說必須使用像DOM或StAX這樣的XML解析器。但不能與常規的IOStream一起使用?我目前正在嘗試使用IOStream的幫助,但這不能解決我的目的,它更復雜。使用Java將兩個XML文件合併到一個XML文件中

例如,我試過的是;

   public class GUI { 

      public static void main(String[] args) throws Exception { 

      // Creates file to write to 
      Writer output = null; 
      output = new BufferedWriter(new FileWriter("C:\\merged.xml")); 
      String newline = System.getProperty("line.separator"); 

      output.write(""); 

      // Read in xml file 1 
      FileInputStream in = new FileInputStream("C:\\1.xml"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
      String strLine; 

      while ((strLine = br.readLine()) != null) { 

      if (strLine.contains("<MemoryDump>")){ 
      strLine = strLine.replace("<MemoryDump>", "xmlns:xsi"); 
      } 
      if (strLine.contains("</MemoryDump>")){ 
      strLine = strLine.replace("</MemoryDump>", "xmlns:xsd"); 
      } 

      output.write(newline); 
      output.write(strLine); 

      System.out.println(strLine); 
      } 

      // Read in xml file 2 
      FileInputStream in = new FileInputStream("C:\\2.xml"); 
      BufferedReader br1 = new BufferedReader(new InputStreamReader(in)); 
      String strLine1; 

      while ((strLine1 = br1.readLine()) != null) { 

      if (strLine1.contains("<MemoryDump>")){ 
      strLine1 = strLine1.replace("<MemoryDump>", ""); 
      } 
      if (strLine1.contains("</MemoryDump>")){ 
      strLine1 = strLine1.replace("</MemoryDump>", ""); 
      } 

      output.write(newline); 
      output.write(strLine1); 

我請求您請讓我知道如何通過添加其他內容來合併兩個XML文件。如果你可以提供一些示例鏈接,那將是非常棒的!!

謝謝您提前..! System.out.println(strLine1); }

}

回答

1

不完全相信你希望做什麼。合併是否意味着:

a。您想要合併2個DOM的內容,並創建一個對象模型(一個有效的模型),並附加節點

b。你想合併這兩個文件一個接一個,而不關心實際內容

如果它是一個,使用XML解析器。當然,你可以手動編寫這些東西,並嘗試將流處理成dom對象,但是你會重寫很多這些解析器的用途。爲什麼要重寫那些已經存在的東西。

如果是b,只是做一個愚蠢的副本。複製第一個文件(再次使用實用程序,例如apache常用的FileUtil允許您複製文件。除非必要,否則不要寫入),打開一個IO流到複製的文件,然後讀取和寫入第二個文件。

+0

我想合併兩個XML文件並將其寫入另一個XML文件。對不起,以前不清楚。 – dmurali 2012-04-11 17:32:04

+0

如果合併文件的*內容*,請將兩者(使用JDOM等解析器)讀入dom對象,創建一個全新的對象,您將追加到該對象,遍歷原始2個對象的模型,追加到新對象。沖洗並重復 – Michael 2012-04-11 17:42:01

+0

我不確定我是否正確理解了你的觀點。我將不得不使用JDOM解析器讀取'file1',並從中取出必要的內容將其添加到'file2'中,是嗎? – dmurali 2012-04-11 18:01:41

1

作爲一般規則,絕對不要在詞法級別對XML進行任何處理:始終使用XML解析器。 (如果(a)您是一位XML專家,那麼您可以打破此規則,因此您知道可能出錯的地方,以及(b)您知道結果始終不必是正確的。)

其次,進行這種處理最簡單的方法是使用爲該作業設計的語言,如XSLT或XQuery。使用Java使它非常花費工作。

如果您對要合併的文件類型更具體,以及希望輸出結果如何,我們可以給出更準確的答案。

+0

是的,我可以延長我的懷疑。我想合併兩個'XML'文件,輸出也應該是'XML'文件。在第一個文件中,第二個文件中缺少兩個nodeAttributes,第二個文件中有另一個標記 ...第一個文件中缺少該標記。 – dmurali 2012-04-12 09:24:26

+0

我正在嘗試使用XSLT,但這使我的工作非常複雜。我可以知道什麼是文件xslt =新文件(「」),我的意思是什麼是文件作爲xslt文件,在我的情況?因爲我目前只有兩個xml文件。 – dmurali 2012-04-12 09:26:04

+0

你們中的任何人都可以告訴我如何在xml文件的中間添加和? (使用java DOM)? – dmurali 2012-04-12 14:39:45

0
package com.cts.sterling.order; 

//package com.academy.ecommerce.sterling.userexits; 
import java.io.File; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 
import com.cts.sterling.custom.accelerators.util.XMLUtil; 


public class MergeXml { 

    public static Document mergeXml(Document doc1, Document doc2) 

      throws Exception { 

     // Getting the attributes of OrderLine from document2 and document1 
     NodeList objOrderLineList2 = doc2.getElementsByTagName("OrderLine"); 
     NodeList objOrderLineList1 = doc1.getElementsByTagName("OrderLine"); 

     // Creating Element for OrderLine 
     Element eleOrderline2 = (Element) objOrderLineList2.item(0); 
     Element eleOrderline1 = (Element) objOrderLineList1.item(0); 

     // Declaring attributes as String array 
     String[] Line1={"LineType","LevelOfService"}; 

     // Copying attributes from document2 to document1 
     XMLUtil.copyAttributes(eleOrderline2, eleOrderline1, Line1); 

     // Getting the attributes of Extn from document2 and document1 
     NodeList objExtn2 = doc2.getElementsByTagName("Extn"); 
     NodeList objExtn1 =doc1.getElementsByTagName("Extn"); 

     // Creating Element for Extn 
     Element eleExtn2 = (Element) objExtn2.item(0); 
     Element eleExtn1 = (Element) objExtn1.item(0); 

     // Declaring attributes as String array 
     String[] Line2={"ExtnMediaCode","ExtnLastName","ExtnGroupID"}; 

     // Copying attributes from document2 to document1 
     XMLUtil.copyAttributes(eleExtn2, eleExtn1, Line2); 

     // Getting the attributes of WSIAddnlOrderLineData from document2 and document1 
     NodeList objAddln2 = doc2.getElementsByTagName("WSIAddnlOrderLineData"); 
     NodeList objAddln1 =doc1.getElementsByTagName("WSIAddnlOrderLineData"); 

     // Creating Element for WSIAddnlOrderLineData 
     Element eleAddln2 = (Element) objAddln2.item(0); 
     Element eleAddln1 = (Element) objAddln1.item(0); 

     // Declaring attributes as String array 
     String[] Line3 ={"ExtnShipMode" , "ExtnDeliverTogether","ExtnComponentReplacementIndicator","ExtnGiftCardRequiredIndicator","ExtnReplOriginalItemID", 
       "ExtnSpecialHandlingIndicator","ExtnSpecialHandlingReasonCode","ExtnCardType","ExtnCardClass","ExtnEcomSuborderNo","ExtnEcomOrderLineNo", 
       "ExtnPFSFlag","ExtnSVCCarrierServiceCode","ExtnSVCSCAC","ExtnSVCUpgradeFlag","ExtnSVCSKUType","ExtnSVCTo","ExtnSVCFrom"}; 

     // Copying attributes from document2 to document1 
     XMLUtil.copyAttributes(eleAddln2, eleAddln1, Line3); 

     // Getting the attributes of Instruction from document2 and document1 
     NodeList objInst2 = doc2.getElementsByTagName("Instruction"); 
     NodeList objInst1 =doc1.getElementsByTagName("Instruction"); 

     // Creating Element for Instruction 
     Element eleInst2 = (Element) objInst2.item(0); 
     Element eleInst1 = (Element) objInst1.item(0); 

     // Declaring attributes as String array 
     String[] Line4 ={"InstructionText","InstructionType","SequenceNo","InstructionURL","InstructionUsage"}; 

     // Copying attributes from document2 to document1 
     XMLUtil.copyAttributes(eleInst2, eleInst1, Line4); 

     //Printing output document 
     System.out.println(XMLUtil.getString(doc1)); 
     return doc1; 

    } 
    //Main method 
    public static void main(String[] args) { 
     try{ 

      File file1 = new File("D:/Handson/merge1.xml"); 
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
      Document doc1 = dBuilder.parse(file1); 
      File file2 = new File("D:/Handson/merge2.xml"); 
      Document doc2 = dBuilder.parse(file2); 

      //calling the method 
      mergeXml(doc1,doc2); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 
+0

cts包中。重命名或刪除軟件包名稱並導入... – Aryan 2014-04-28 11:11:15

+0

我們可以在哪裏找到該XMLUtil類?沒有這個答案沒有太大的幫助。 (正如用戶[Mara4you](http://stackoverflow.com/users/4807412/mara4you)指出的那樣) – Rup 2015-04-19 16:35:56

相關問題