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# 79import os, sys; 80import xml.dom.minidom; 81 82"""Split the jdiff xml into several smaller xml files by specified tag. 83""" 84class 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 146if __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