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