2015-02-05 109 views
1

我在下面的鏈接看了討論合併XML - Merging xml file using java NodeList使用SAX解析器

我只需要使用SAX解析器使用相同的功能,因爲我需要合併只有兩個文件,但他們都非常大大小。 請幫忙。

文件1

<root> 
    <Item> 
     <a>jhiuo55jhj</a> 
     <b>jhjoiohj</b> 
     <c>jhjh334j</c> 
    </Item> 
</root> 

文件2

<root> 
    <Item> 
     <x>jhi99jhj</x> 
     <y>jhyty66jhj</y> 
     <z>jhxdx3jhj</z> 
    </Item> 
</root> 

預期輸出

<root> 
    <Item> 
     <a>jhiuo55jhj</a> 
     <b>jhjoiohj</b> 
     <c>jhjh334j</c> 
     <x>jhi99jhj</x> 
     <y>jhyty66jhj</y> 
     <z>jhxdx3jhj</z> 
    </Item> 
</root> 
+0

亞當嗨, 是的,這是規定。請幫助。 – 2015-02-06 06:58:32

回答

0

基本溶液,不包括命名空間或屬性

  • 使用XMLStreamWriter沉從處理內容到一個輸出
  • 跳過根元素,所以我們不把它們放在輸出兩次

代碼

public class XmlMerger { 

    public static void main(String[] args) throws Exception { 
     FileOutputStream outputStream = new FileOutputStream("output.xml"); 
     XMLStreamWriter out = XMLOutputFactory.newInstance().createXMLStreamWriter(new OutputStreamWriter(outputStream)); 

     SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); 

     Handler handler = new Handler(out); 
     out.writeStartDocument(); 
     out.writeStartElement("root"); 
     saxParser.parse(new File("input1.xml"), handler); 
     saxParser.parse(new File("input2.xml"), handler); 
     out.writeEndElement(); 
     out.close(); 
    } 

    private static class Handler extends DefaultHandler { 

     private XMLStreamWriter out; 
     private boolean dumping; 

     public Handler(XMLStreamWriter out) { 
      this.out = out; 
     } 

     @Override 
     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 

      if ("root".equals(qName)) { 
       dumping = true; 
      } else { 
       try { 
        out.writeStartElement(qName); 
        // TODO attributes if you need them... 
       } catch (XMLStreamException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     @Override 
     public void endElement(String uri, String localName, String qName) throws SAXException { 
      if ("root".equals(qName)) { 
       dumping = false; 
      } else { 
       try { 
        out.writeEndElement(); 
       } catch (XMLStreamException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     @Override 
     public void characters(char ch[], int start, int length) throws SAXException { 
      if (!dumping) { 
       return; 
      } 
      try { 
       out.writeCharacters(ch, start, length); 
      } catch (XMLStreamException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 
} 
+0

感謝Adam,爲您提供快速幫助。 讓我試試這個,但是我在方法endElement 中得到了錯誤,無法解決傾銷並將這兩者解決。 – 2015-02-06 07:13:44

+0

@亞當,你的程序給出如下的輸出,這不是Sugata要求的... jhiuo55jhj jhjoiohj jhjh334j jhi99jhj jhyty66jhj jhxdx3jhj Abhishek 2015-02-06 08:37:44

+0

嗨Adam, 我運行了代碼,但它追加了兩個xmls,我需要將file1中的每個項目與文件2中的每個項目合併。 即最終輸出將包含所有項目節點,其中包含來自file1的項目節點的所有字段,文件2。 – 2015-02-06 08:43:36

0

我會說你去SAX-DOM方法可以獲得更好的性能。

比方說,下面是輸入XML文件

1) First.xml 
<root> 
    <Item> 
     <a>1</a> 
     <b>2</b> 
     <c>3</c> 
    </Item> 
    <Item> 
     <a>1</a> 
     <b>2</b> 
     <c>3</c> 
    </Item> 
</root> 
2) Second.xml 
<root> 
    <Item> 
     <x>11</x> 
     <y>22</y> 
     <z>33</z> 
    </Item> 
    <Item> 
     <x>44</x> 
     <y>55</y> 
     <z>66</z> 
    </Item> 
</root> 

的步驟合併這個XML:

  1. 使用DOM
  2. 閱讀First.xml
  3. 現在開始讀Second.xml使用SAX
  4. 保留計數器變量i
  5. 每當SAX解析器找到startElement for Item node,從存儲在DOM中的ith Item節點的First.xml中獲取其他字段。
  6. 我++
  7. 寫的內容的OutputStream
  8. 解析完成後,關閉的OutputStream