我想使用我熟悉的语言 - Java,C#,Ruby,PHP,C/C++,尽管任何语言或伪代码的例子都非常受欢迎.
将大型XML文档拆分为仍然有效的XML的较小部分的最佳方法是什么?为了我的目的,我需要将它们分成大约三分之二或四分之一,但为了提供示例,将它们分成n个组件会很好.
使用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()
Run Code Online (Sandbox Code Playgroud)
小智 3
当然,您始终可以提取顶级元素(这是否是您想要的粒度取决于您)。在 C# 中,您可以使用 XmlDocument 类。例如,如果您的 XML 文件如下所示:
<Document>
<Piece>
Some text
</Piece>
<Piece>
Some other text
</Piece>
</Document>
Run Code Online (Sandbox Code Playgroud)
然后你可以使用这样的代码来提取所有的片段:
XmlDocument doc = new XmlDocument();
doc.Load("<path to xml file>");
XmlNodeList nl = doc.GetElementsByTagName("Piece");
foreach (XmlNode n in nl)
{
// Do something with each Piece node
}
Run Code Online (Sandbox Code Playgroud)
获得节点后,您可以在代码中对它们执行某些操作,或者可以将节点的整个文本传输到其自己的 XML 文档中,并对其进行操作,就像它是独立的 XML 片段一样(包括保存它)返回磁盘等)。