代码之家  ›  专栏  ›  技术社区  ›  Karussell

高效地将多个大型xml文件合并为一个

  •  4
  • Karussell  · 技术社区  · 16 年前

    我在网上搜索,上下搜索。没有解决办法。尽管我找到了在纯xslt中如何做到这一点的解决方案 here .

    让我详细解释一下。我有几个应该被解析的xml文件(最好是InputSteam)。文件或输入流看起来像

    输入流1

    <root>
      <doc>
        <tag>test1</tag>
      </doc>
      <doc>
        <tag>test2</tag>
      </doc>
      ...
    </root>
    

    输入流2

    <root>
      <doc>
        <tag>test3</tag>
      </doc>
      <doc>
        <tag>test4</tag>
      </doc>
      ...
    </root>
    

    输入流1+输入流2+…+输入流n= 生成的xml

    <root>
      <doc>
        <tag>test1</tag>
      </doc>
      <doc>
        <tag>test2</tag>
      </doc>
      ...
       <doc>
        <tag>test3</tag>
      </doc>
      <doc>
        <tag>test4</tag>
      </doc>
      ...
    </root>
    

    有人对此有解决方案或链接吗?这是通过实现自定义InputSource实现的,还是应该使用自定义ContentHandler?或者这是可能的吗 joost/stx ?

    如果我可以使用ContentHandler,那么我可以应用一些小的转换(我已经实现了这个)。但问题是,我不知道如何将多个文件或InputStream作为InputSource传递:

    XMLReader xmlReader = XMLReaderFactory.createXMLReader();
    xmlReader.setContentHandler(customHandler);
    xmlReader.parse(getInputSource()); // only one InputStream possible
    

    或者我应该直接在ContentHandler中解析InputStreams吗?

    4 回复  |  直到 9 年前
        1
  •  2
  •   Don Roby    16 年前

    我自己还没有做过,但我记得看到一篇IBMdeveloperWorks的文章,看起来很容易做到这一点。

    现在有点旧了,但试试看 http://www.ibm.com/developerworks/xml/library/x-tipstx5/index.html

    这是StAX而不是SAX。我不确定当前的jdk是否包含StAX。如果不是的话,你可以从 http://stax.codehaus.org/

        2
  •  1
  •   Thorbjørn Ravn Andersen    16 年前

    您可能想看看Saxon的付费版本。它可以动态处理XSLT,而不需要内存中的完整DOM。

        3
  •  0
  •   Karussell    16 年前

    我最终通过以下代码片段实现了这一点:

      finalHandler = new StreamResult(new OutputStreamWriter(System.out));
      // customHandler extends DefaultHandler
      CustomTransformerHandler customHandler = new CustomTransformerHandler(
             finalHandler);
      customHandler.startDocumentExplicitly();
      InputStream is = null;
      while ((is = customHandler.createNextInputStream()) != null) {
        // multiple inputStream parsing
        XMLReader myReader = XMLReaderFactory.createXMLReader();
        myReader.setContentHandler(customHandler);
        myReader.parse(new InputSource(is));
      }
      customHandler.endDocumentExplicitly();
    

    重要的部分是将startDocument和endDocument方法留空。所有其他方法(characters、startElement、endElement)都将重定向到finalHandler。如果读取了所有inputstreams,customHandler.createNextInputStream方法将返回null。

        4
  •  0
  •   vtd-xml-author    10 年前

    VTD-XML

    import com.ximpleware.*;
    import java.io.*;
    
    public class merge {
        // merge second.xml into first.xml assuming the same encoding
        public static void main(String[] s) throws VTDException, IOException{
            VTDGen vg = new VTDGen();
            if (!vg.parseFile("d:\\xml\\first.xml", false))
                return;
            VTDNav vn1=vg.getNav();
            if(!vg.parseFile("d:\\xml\\second.xml", false))
                return;
            VTDNav vn2 = vg.getNav();
            XMLModifier xm = new XMLModifier(vn1);
            long l = vn2.getContentFragment();
            xm.insertBeforeTail(vn2, l);
            xm.output("d:\\xml\\merged.xml");   
        }
    }
    
    推荐文章
    Praxder  ·  SAX XMLParser不工作
    13 年前