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