当前位置:  开发笔记 > 编程语言 > 正文

如何将XML文档拆分为三分之一(或者更好的是,n个部分)?

如何解决《如何将XML文档拆分为三分之一(或者更好的是,n个部分)?》经验,为你挑选了1个好方法。

我想使用我熟悉的语言 - Java,C#,Ruby,PHP,C/C++,尽管任何语言或伪代码的例子都非常受欢迎.

将大型XML文档拆分为仍然有效的XML的较小部分的最佳方法是什么?为了我的目的,我需要将它们分成大约三分之二或四分之一,但为了提供示例,将它们分成n个组件会很好.



1> Jonas Engman..:

使用DOM解析XML文档无法扩展.

这个Groovy -script使用StAX(Streaming API for XML)在顶层元素(与根文档的第一个子节点共享相同的QName)之间拆分XML文档.它非常快,处理任意大型文档,并且当您想要将大型批处理文件拆分为较小的块时非常有用.

在Java 6或StAX API上需要Groovy ,在CLASSPATH中需要Woodstox等实现

import javax.xml.stream.*

pieces = 5
input = "input.xml"
output = "output_%04d.xml"
eventFactory = XMLEventFactory.newInstance()
fileNumber = elementCount = 0

def createEventReader() {
    reader = XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream(input))
    start = reader.next()
    root = reader.nextTag()
    firstChild = reader.nextTag()
    return reader
}

def createNextEventWriter () {
    println "Writing to '${filename = String.format(output, ++fileNumber)}'"
    writer = XMLOutputFactory.newInstance().createXMLEventWriter(new FileOutputStream(filename), start.characterEncodingScheme)
    writer.add(start)
    writer.add(root)
    return writer
}

elements = createEventReader().findAll { it.startElement && it.name == firstChild.name }.size()
println "Splitting ${elements} <${firstChild.name.localPart}> elements into ${pieces} pieces"
chunkSize = elements / pieces
writer = createNextEventWriter()
writer.add(firstChild)
createEventReader().each { 
    if (it.startElement && it.name == firstChild.name) {
        if (++elementCount > chunkSize) {
            writer.add(eventFactory.createEndDocument())
            writer.flush()
            writer = createNextEventWriter()
            elementCount = 0
        }
    }
    writer.add(it)
}
writer.flush()

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有