]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py
b93588eea61a12c099ee2e57a7a1127bca5b8cd8
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / Xml / XmlRoutines.py
1 ## @file
2 # This is an XML API that uses a syntax similar to XPath, but it is written in
3 # standard python so that no extra python packages are required to use it.
4 #
5 # Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
10 #
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 #
14
15 ##
16 # Import Modules
17 #
18 import xml.dom.minidom
19 from Common.LongFilePathSupport import OpenLongFilePath as open
20
21 ## Create a element of XML
22 #
23 # @param Name
24 # @param String
25 # @param NodeList
26 # @param AttributeList
27 #
28 # @revel Element
29 #
30 def CreateXmlElement(Name, String, NodeList, AttributeList):
31 Doc = xml.dom.minidom.Document()
32 Element = Doc.createElement(Name)
33 if String != '' and String != None:
34 Element.appendChild(Doc.createTextNode(String))
35
36 for Item in NodeList:
37 if type(Item) == type([]):
38 Key = Item[0]
39 Value = Item[1]
40 if Key != '' and Key != None and Value != '' and Value != None:
41 Node = Doc.createElement(Key)
42 Node.appendChild(Doc.createTextNode(Value))
43 Element.appendChild(Node)
44 else:
45 Element.appendChild(Item)
46 for Item in AttributeList:
47 Key = Item[0]
48 Value = Item[1]
49 if Key != '' and Key != None and Value != '' and Value != None:
50 Element.setAttribute(Key, Value)
51
52 return Element
53
54 ## Get a list of XML nodes using XPath style syntax.
55 #
56 # Return a list of XML DOM nodes from the root Dom specified by XPath String.
57 # If the input Dom or String is not valid, then an empty list is returned.
58 #
59 # @param Dom The root XML DOM node.
60 # @param String A XPath style path.
61 #
62 # @revel Nodes A list of XML nodes matching XPath style Sting.
63 #
64 def XmlList(Dom, String):
65 if String == None or String == "" or Dom == None or Dom == "":
66 return []
67 if Dom.nodeType == Dom.DOCUMENT_NODE:
68 Dom = Dom.documentElement
69 if String[0] == "/":
70 String = String[1:]
71 TagList = String.split('/')
72 Nodes = [Dom]
73 Index = 0
74 End = len(TagList) - 1
75 while Index <= End:
76 ChildNodes = []
77 for Node in Nodes:
78 if Node.nodeType == Node.ELEMENT_NODE and Node.tagName == TagList[Index]:
79 if Index < End:
80 ChildNodes.extend(Node.childNodes)
81 else:
82 ChildNodes.append(Node)
83 Nodes = ChildNodes
84 ChildNodes = []
85 Index += 1
86
87 return Nodes
88
89
90 ## Get a single XML node using XPath style syntax.
91 #
92 # Return a single XML DOM node from the root Dom specified by XPath String.
93 # If the input Dom or String is not valid, then an empty string is returned.
94 #
95 # @param Dom The root XML DOM node.
96 # @param String A XPath style path.
97 #
98 # @revel Node A single XML node matching XPath style Sting.
99 #
100 def XmlNode(Dom, String):
101 if String == None or String == "" or Dom == None or Dom == "":
102 return ""
103 if Dom.nodeType == Dom.DOCUMENT_NODE:
104 Dom = Dom.documentElement
105 if String[0] == "/":
106 String = String[1:]
107 TagList = String.split('/')
108 Index = 0
109 End = len(TagList) - 1
110 ChildNodes = [Dom]
111 while Index <= End:
112 for Node in ChildNodes:
113 if Node.nodeType == Node.ELEMENT_NODE and Node.tagName == TagList[Index]:
114 if Index < End:
115 ChildNodes = Node.childNodes
116 else:
117 return Node
118 break
119 Index += 1
120 return ""
121
122
123 ## Get a single XML element using XPath style syntax.
124 #
125 # Return a single XML element from the root Dom specified by XPath String.
126 # If the input Dom or String is not valid, then an empty string is returned.
127 #
128 # @param Dom The root XML DOM object.
129 # @param Strin A XPath style path.
130 #
131 # @revel Element An XML element matching XPath style Sting.
132 #
133 def XmlElement(Dom, String):
134 try:
135 return XmlNode(Dom, String).firstChild.data.strip()
136 except:
137 return ""
138
139
140 ## Get a single XML element of the current node.
141 #
142 # Return a single XML element specified by the current root Dom.
143 # If the input Dom is not valid, then an empty string is returned.
144 #
145 # @param Dom The root XML DOM object.
146 #
147 # @revel Element An XML element in current root Dom.
148 #
149 def XmlElementData(Dom):
150 try:
151 return Dom.firstChild.data.strip()
152 except:
153 return ""
154
155
156 ## Get a list of XML elements using XPath style syntax.
157 #
158 # Return a list of XML elements from the root Dom specified by XPath String.
159 # If the input Dom or String is not valid, then an empty list is returned.
160 #
161 # @param Dom The root XML DOM object.
162 # @param String A XPath style path.
163 #
164 # @revel Elements A list of XML elements matching XPath style Sting.
165 #
166 def XmlElementList(Dom, String):
167 return map(XmlElementData, XmlList(Dom, String))
168
169
170 ## Get the XML attribute of the current node.
171 #
172 # Return a single XML attribute named Attribute from the current root Dom.
173 # If the input Dom or Attribute is not valid, then an empty string is returned.
174 #
175 # @param Dom The root XML DOM object.
176 # @param Attribute The name of Attribute.
177 #
178 # @revel Element A single XML element matching XPath style Sting.
179 #
180 def XmlAttribute(Dom, Attribute):
181 try:
182 return Dom.getAttribute(Attribute).strip()
183 except:
184 return ''
185
186
187 ## Get the XML node name of the current node.
188 #
189 # Return a single XML node name from the current root Dom.
190 # If the input Dom is not valid, then an empty string is returned.
191 #
192 # @param Dom The root XML DOM object.
193 #
194 # @revel Element A single XML element matching XPath style Sting.
195 #
196 def XmlNodeName(Dom):
197 try:
198 return Dom.nodeName.strip()
199 except:
200 return ''
201
202 ## Parse an XML file.
203 #
204 # Parse the input XML file named FileName and return a XML DOM it stands for.
205 # If the input File is not a valid XML file, then an empty string is returned.
206 #
207 # @param FileName The XML file name.
208 #
209 # @revel Dom The Dom object achieved from the XML file.
210 #
211 def XmlParseFile(FileName):
212 try:
213 XmlFile = open(FileName)
214 Dom = xml.dom.minidom.parse(XmlFile)
215 XmlFile.close()
216 return Dom
217 except Exception, X:
218 print X
219 return ""
220
221 # This acts like the main() function for the script, unless it is 'import'ed
222 # into another script.
223 if __name__ == '__main__':
224 # Nothing to do here. Could do some unit tests.
225 A = CreateXmlElement('AAA', 'CCC', [['AAA', '111'], ['BBB', '222']], [['A', '1'], ['B', '2']])
226 B = CreateXmlElement('ZZZ', 'CCC', [['XXX', '111'], ['YYY', '222']], [['A', '1'], ['B', '2']])
227 C = CreateXmlList('DDD', 'EEE', [A, B], ['FFF', 'GGG'])
228 print C.toprettyxml(indent = " ")
229 pass