• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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