Преобразование большого XML-документа без программирования - PullRequest
0 голосов
/ 02 октября 2010

У меня есть файл (несколько ГБ), содержащий данные

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

Я хочу преобразовать в другой XML

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

Возможно ли это сделать с помощью написанной на заказ программы?

Спасибо,

Ответы [ 4 ]

1 голос
/ 02 октября 2010

Просто используйте XSLT - это то, для чего он предназначен. W3Schools делает хороший учебник .

Я не знаю, что вы подразумеваете под "без программирования". Вы хотите инструмент с графическим интерфейсом? С XSLT было бы намного проще.

1 голос
/ 02 октября 2010

Я бы тоже пошел с XSLT, но также включил бы анализатор StAX, так как он мог бы повысить производительность при работе с большими XML-файлами.

1 голос
/ 02 октября 2010

Это был бы довольно простой XSLT, поэтому вам просто нужно использовать любой обычный способ применения XSLT на вашем языке. XSLT будет нестандартным, хотя на самом деле нет положительного ответа на вопрос «могу ли я выполнить это нестандартное требование без специальной реализации?»

0 голосов
/ 05 марта 2011

Самый эффективный способ использовать SAX или подобный парсер. Например, 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()
...