#! /usr/bin/python # # Copyright 2008, The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # This script is used to split the jdiff xml into several smaller xml files # so that we could avoid the xml resource limit in Android platform. # # Usage: # android_api_description.py xmlfile tagname # # The script will do the following: # 1. Read the xml file and generate DOM tree # 2. Generate xml file for each tagname. # # Example: # xml source: # <Root> # <A name="i"> # <B>1</B> # <B>2</B> # </A> # <A name="ii"> # <B>3</B> # </A> # </Root> # # when the tagname is specified as A, it will generate two xml files: # first one's source: # <Root> # <A name="i"> # <B>1</B> # <B>2</B> # </A> # </Root> # second one's source: # <Root> # <A name="ii"> # <B>3</B> # </A> # </Root> # # when the tagname is specified as B, it will generated three xml files: # first one's source: # <Root> # <A name="i"> # <B>1</B> # </A> # </Root> # second one's source: # <Root> # <A name="i"> # <B>2</B> # </A> # </Root> # third one's source: # <Root> # <A name="ii"> # <B>3</B> # </A> # </Root> # # NOTE: # 1. Currently just suppor the top level element # 2. Use the name attribute of the specified element as the file name # 3. Currently will remove all the doc element. - workaround for jdiff xml # import os, sys; import xml.dom.minidom; """Split the jdiff xml into several smaller xml files by specified tag. """ class XMLSplitter: def __init__(self, xmlfile, outPath): self.doc = xml.dom.minidom.parse(xmlfile) self.root = self.doc.documentElement self.out = os.path.join(outPath, "xml") if not os.path.isdir(self.out): os.makedirs(self.out) return def split(self, tag): elemlist = self.doc.getElementsByTagName(tag) for elem in elemlist: elem = self.__trimElem(elem) self.__generateFile(elem) return def __trimElem(self, elem): children = [] for child in elem.childNodes: if child.nodeType == xml.dom.minidom.Node.ELEMENT_NODE: children.append(child) for child in children: if child.nodeName == "doc": elem.removeChild(child) children.remove(child) for child in children: child = self.__trimElem(child) return elem def __generateFile(self, elem): self.__removeAllChild(self.root) filename = os.path.join(self.out, elem.getAttribute("name").replace(".", "_").lower() + ".xml") doc = xml.dom.minidom.Document() doc.appendChild(self.root) self.root.appendChild(elem) fd = open(filename, "w") fd.write(doc.toxml()) fd.close return def __removeAllChild(self, elem): children = [] for child in elem.childNodes: children.append(child) for child in children: elem.removeChild(child) return if __name__ == "__main__": if len(sys.argv) < 4: print "Usage: splitxml.py xmlfile outpath tagname" sys.exit(1) xmlsplitter = XMLSplitter(sys.argv[1], sys.argv[2]) xmlsplitter.split(sys.argv[3])