Home | History | Annotate | Download | only in utils
      1 #! /usr/bin/python

      2 #

      3 # Copyright 2008, The Android Open Source Project

      4 #

      5 # Licensed under the Apache License, Version 2.0 (the "License"); 

      6 # you may not use this file except in compliance with the License. 

      7 # You may obtain a copy of the License at 

      8 #

      9 #     http://www.apache.org/licenses/LICENSE-2.0 

     10 #

     11 # Unless required by applicable law or agreed to in writing, software 

     12 # distributed under the License is distributed on an "AS IS" BASIS, 

     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

     14 # See the License for the specific language governing permissions and 

     15 # limitations under the License.

     16 #

     17 # This script is used to split the jdiff xml into several smaller xml files

     18 # so that we could avoid the xml resource limit in Android platform.

     19 #

     20 # Usage:

     21 #    android_api_description.py xmlfile tagname

     22 #

     23 # The script will do the following:

     24 #    1. Read the xml file and generate DOM tree

     25 #    2. Generate xml file for each tagname.

     26 #

     27 # Example:

     28 # xml source:

     29 #    <Root>

     30 #        <A name="i">

     31 #            <B>1</B>

     32 #            <B>2</B>

     33 #        </A>

     34 #        <A name="ii">

     35 #            <B>3</B>

     36 #        </A>

     37 #    </Root>

     38 # 

     39 # when the tagname is specified as A, it will generate two xml files:

     40 # first one's source:

     41 #    <Root>

     42 #        <A name="i">

     43 #            <B>1</B>

     44 #            <B>2</B>

     45 #        </A>

     46 #    </Root>

     47 # second one's source:

     48 #    <Root>

     49 #        <A name="ii">

     50 #            <B>3</B>

     51 #        </A>

     52 #    </Root>

     53 #

     54 # when the tagname is specified as B, it will generated three xml files:

     55 # first one's source:

     56 #    <Root>

     57 #        <A name="i">

     58 #            <B>1</B>

     59 #        </A>

     60 #    </Root>

     61 # second one's source:

     62 #    <Root>

     63 #        <A name="i">

     64 #            <B>2</B>

     65 #        </A>

     66 #    </Root>

     67 # third one's source:

     68 #    <Root>

     69 #        <A name="ii">

     70 #            <B>3</B>

     71 #        </A>

     72 #    </Root>

     73 #

     74 # NOTE: 

     75 #    1. Currently just suppor the top level element

     76 #    2. Use the name attribute of the specified element as the file name

     77 #    3. Currently will remove all the doc element. - workaround for jdiff xml

     78 #

     79 import os, sys;
     80 import xml.dom.minidom;
     81 
     82 """Split the jdiff xml into several smaller xml files by specified tag.
     83 """
     84 class XMLSplitter:
     85     def __init__(self, xmlfile, outPath):
     86         self.doc = xml.dom.minidom.parse(xmlfile)
     87         self.root = self.doc.documentElement
     88         self.out = os.path.join(outPath, "xml")
     89         if not os.path.isdir(self.out):
     90             os.makedirs(self.out)
     91         return
     92 
     93     def split(self, tag):
     94 
     95         elemlist = self.doc.getElementsByTagName(tag)
     96 
     97         for elem in elemlist:
     98             elem = self.__trimElem(elem)
     99             self.__generateFile(elem)
    100 
    101         return
    102 
    103     def __trimElem(self, elem):
    104         children = []
    105         for child in elem.childNodes:
    106             if child.nodeType == xml.dom.minidom.Node.ELEMENT_NODE:
    107                 children.append(child)
    108 
    109         for child in children:
    110             if child.nodeName == "doc":
    111                 elem.removeChild(child)
    112                 children.remove(child)
    113 
    114         for child in children:
    115             child = self.__trimElem(child)
    116 
    117         return elem
    118 
    119 
    120     def __generateFile(self, elem):
    121         self.__removeAllChild(self.root)
    122 
    123         filename = os.path.join(self.out, elem.getAttribute("name").replace(".", "_").lower() + ".xml")
    124 
    125         doc = xml.dom.minidom.Document()
    126         doc.appendChild(self.root)
    127 
    128         self.root.appendChild(elem)
    129 
    130         fd = open(filename, "w")
    131         fd.write(doc.toxml())
    132         fd.close
    133 
    134         return
    135 
    136     def __removeAllChild(self, elem):
    137         children = []
    138         for child in elem.childNodes:
    139             children.append(child)
    140 
    141         for child in children:
    142             elem.removeChild(child)
    143 
    144         return
    145 
    146 if __name__ == "__main__":
    147     if len(sys.argv) < 4:
    148         print "Usage: splitxml.py xmlfile outpath tagname"
    149         sys.exit(1)
    150 
    151     xmlsplitter = XMLSplitter(sys.argv[1], sys.argv[2])
    152 
    153     xmlsplitter.split(sys.argv[3])
    154 
    155