首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并多个xml文件,并将每个xml文件的公共根元素设置为合并文件的根。

合并多个xml文件,并将每个xml文件的公共根元素设置为合并文件的根。
EN

Stack Overflow用户
提问于 2016-06-22 12:07:40
回答 2查看 551关注 0票数 1

我需要将目录中的残缺xml文件合并为单个xml文件。以下是我正在努力实现的目标:

xml-1:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<products>
      <product>
            <id>0569054</id>
            <ProviderName>John</ProviderName>
      </product>
</products>

xml-2

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
        <id>1002363</id>
        <ProviderName>Paul</ProviderName>
  </product>
</products>

合并输出:

代码语言:javascript
复制
<?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来实施这一点,纠正建议也是最受欢迎的。

代码语言:javascript
复制
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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-22 21:42:46

用Java做这件事很简单而且很直接..。下面是基于VTD-XML合并文件的代码。它基本上是附加字节,不包括开始和结束标记。假设您打开文件并使用鼠标指针突出显示文本部分,然后将其粘贴到输出文本编辑器。这里的情况就是这样。

代码语言:javascript
复制
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();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-06-22 15:25:11

您真的不想在Java中这样做。在XSLT2.0中,

代码语言:javascript
复制
<xsl:template name="main">
  <products>
    <xsl:copy-of select="collection('file://mydir')/*/*"/>
  </products>
</xsl:template>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37967575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档