无需编程即可转换大型XML文档

时间:2010-10-02 13:56:17

标签: xml sax

我有一个文件(几GB),包含数据

 <doc>
     <a1>11111</a1>
     <b1>22222</b1>
     <c1>33333</c1>
 </doc>

我想转换为另一种XML

 <doc2>
     <f1>11111</f1>
     <f2>33333</f2>
 </doc2>

是否可以使用自定义编写的程序?

谢谢,

4 个答案:

答案 0 :(得分:1)

这将是一个非常简单的XSLT,因此您只需要使用您的语言中存在的任何正常应用XSLT的方式。 XSLT是自定义的,虽然没有真正的答案“我可以在没有自定义实现的情况下执行此自定义要求吗?”

答案 1 :(得分:1)

只需使用XSLT - 它就是它的设计目标。 W3Schools对它做了很好的tutorial

我不知道你的意思是“没有编程”。你想要一个GUI工具吗?使用XSLT会更容易。

答案 2 :(得分:1)

我也会使用XSLT,但也会抛出StAX解析器,因为它可能会在大型XML文件上提供更好的性能。

答案 3 :(得分:0)

使用SAX或类似解析器的最有效方法。例如,带有expat的Python随Python一起发布:

#-------------------------------------------------------------------------------
# Author:      nad2000 AT google DOT com
#
#    Saple demonstrating how to trasform:
#
#        <doc>
#            <a1>11111</a1>
#            <b1>22222</b1>
#            <c1>33333</c1>
#        </doc>
#
#    into:
#
#        <doc2>
#            <f1>11111</f1>
#            <f2>33333</f2>
#        </doc2>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

from xml.parsers import expat

class DocParser:
    def __init__(self):
        self._parser = expat.ParserCreate()
        self._parser.StartElementHandler = self.start
        self._parser.EndElementHandler = self.end
        self._parser.CharacterDataHandler = self.data

    def feedFile(self, fileName):
        file= open( fileName, mode='rb')
        self._parser.ParseFile( file)
        file.close()

    def close(self):
        del self._parser # get rid of circular references

    def start(self, tag, attrs):
        if tag == 'doc':
            print ('<?xml version="1.0" encoding="UTF-8"?>')
            print ("<doc2>")

    def end(self, tag):
        if tag == 'a1':
            print ("\t<f1>%s</f1>" % self._data)
        elif tag == 'c1':
            print ("\t<f2>%s</f2>" % self._data)
        elif tag == 'doc':
            print ("</doc2>")

    def data(self, data):
        self._data = data

def main():
    p = DocParser()
    p.feedFile( "sample.xml")
    p.close()
    pass

if __name__ == '__main__':
    main()