繁体   English   中英

使用SAX解析器合并XML

[英]Merging XML using SAX parser

我在下面的链接中查看了讨论- 使用Java NodeList合并xml文件

我只需要使用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> 

基本解决方案,不包括命名空间或属性

  • 使用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();
            }
        }

    }
}

我想说您在这里采用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阅读First.xml
  2. 现在开始使用SAX阅读Second.xml
  3. 保持计数器变量i
  4. 每当SAX解析器为Item节点找到startElement时 ,就从第i个Item节点的First.xml中获取其他字段,该字段存储在DOM中。
  5. 我++
  6. 将内容写入OutputStream
  7. 解析完成,关闭Outputstream

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM