| #! /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]) | |