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