| ## @file | |
| # This is an XML API that uses a syntax similar to XPath, but it is written in | |
| # standard python so that no extra python packages are required to use it. | |
| # | |
| # Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> | |
| # This program and the accompanying materials | |
| # are licensed and made available under the terms and conditions of the BSD License | |
| # which accompanies this distribution. The full text of the license may be found at | |
| # http://opensource.org/licenses/bsd-license.php | |
| # | |
| # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| # | |
| ## | |
| # Import Modules | |
| # | |
| import xml.dom.minidom | |
| from Common.LongFilePathSupport import OpenLongFilePath as open | |
| ## Create a element of XML | |
| # | |
| # @param Name | |
| # @param String | |
| # @param NodeList | |
| # @param AttributeList | |
| # | |
| # @revel Element | |
| # | |
| def CreateXmlElement(Name, String, NodeList, AttributeList): | |
| Doc = xml.dom.minidom.Document() | |
| Element = Doc.createElement(Name) | |
| if String != '' and String != None: | |
| Element.appendChild(Doc.createTextNode(String)) | |
| for Item in NodeList: | |
| if type(Item) == type([]): | |
| Key = Item[0] | |
| Value = Item[1] | |
| if Key != '' and Key != None and Value != '' and Value != None: | |
| Node = Doc.createElement(Key) | |
| Node.appendChild(Doc.createTextNode(Value)) | |
| Element.appendChild(Node) | |
| else: | |
| Element.appendChild(Item) | |
| for Item in AttributeList: | |
| Key = Item[0] | |
| Value = Item[1] | |
| if Key != '' and Key != None and Value != '' and Value != None: | |
| Element.setAttribute(Key, Value) | |
| return Element | |
| ## Get a list of XML nodes using XPath style syntax. | |
| # | |
| # Return a list of XML DOM nodes from the root Dom specified by XPath String. | |
| # If the input Dom or String is not valid, then an empty list is returned. | |
| # | |
| # @param Dom The root XML DOM node. | |
| # @param String A XPath style path. | |
| # | |
| # @revel Nodes A list of XML nodes matching XPath style Sting. | |
| # | |
| def XmlList(Dom, String): | |
| if String == None or String == "" or Dom == None or Dom == "": | |
| return [] | |
| if Dom.nodeType == Dom.DOCUMENT_NODE: | |
| Dom = Dom.documentElement | |
| if String[0] == "/": | |
| String = String[1:] | |
| TagList = String.split('/') | |
| Nodes = [Dom] | |
| Index = 0 | |
| End = len(TagList) - 1 | |
| while Index <= End: | |
| ChildNodes = [] | |
| for Node in Nodes: | |
| if Node.nodeType == Node.ELEMENT_NODE and Node.tagName == TagList[Index]: | |
| if Index < End: | |
| ChildNodes.extend(Node.childNodes) | |
| else: | |
| ChildNodes.append(Node) | |
| Nodes = ChildNodes | |
| ChildNodes = [] | |
| Index += 1 | |
| return Nodes | |
| ## Get a single XML node using XPath style syntax. | |
| # | |
| # Return a single XML DOM node from the root Dom specified by XPath String. | |
| # If the input Dom or String is not valid, then an empty string is returned. | |
| # | |
| # @param Dom The root XML DOM node. | |
| # @param String A XPath style path. | |
| # | |
| # @revel Node A single XML node matching XPath style Sting. | |
| # | |
| def XmlNode(Dom, String): | |
| if String == None or String == "" or Dom == None or Dom == "": | |
| return "" | |
| if Dom.nodeType == Dom.DOCUMENT_NODE: | |
| Dom = Dom.documentElement | |
| if String[0] == "/": | |
| String = String[1:] | |
| TagList = String.split('/') | |
| Index = 0 | |
| End = len(TagList) - 1 | |
| ChildNodes = [Dom] | |
| while Index <= End: | |
| for Node in ChildNodes: | |
| if Node.nodeType == Node.ELEMENT_NODE and Node.tagName == TagList[Index]: | |
| if Index < End: | |
| ChildNodes = Node.childNodes | |
| else: | |
| return Node | |
| break | |
| Index += 1 | |
| return "" | |
| ## Get a single XML element using XPath style syntax. | |
| # | |
| # Return a single XML element from the root Dom specified by XPath String. | |
| # If the input Dom or String is not valid, then an empty string is returned. | |
| # | |
| # @param Dom The root XML DOM object. | |
| # @param Strin A XPath style path. | |
| # | |
| # @revel Element An XML element matching XPath style Sting. | |
| # | |
| def XmlElement(Dom, String): | |
| try: | |
| return XmlNode(Dom, String).firstChild.data.strip() | |
| except: | |
| return "" | |
| ## Get a single XML element of the current node. | |
| # | |
| # Return a single XML element specified by the current root Dom. | |
| # If the input Dom is not valid, then an empty string is returned. | |
| # | |
| # @param Dom The root XML DOM object. | |
| # | |
| # @revel Element An XML element in current root Dom. | |
| # | |
| def XmlElementData(Dom): | |
| try: | |
| return Dom.firstChild.data.strip() | |
| except: | |
| return "" | |
| ## Get a list of XML elements using XPath style syntax. | |
| # | |
| # Return a list of XML elements from the root Dom specified by XPath String. | |
| # If the input Dom or String is not valid, then an empty list is returned. | |
| # | |
| # @param Dom The root XML DOM object. | |
| # @param String A XPath style path. | |
| # | |
| # @revel Elements A list of XML elements matching XPath style Sting. | |
| # | |
| def XmlElementList(Dom, String): | |
| return map(XmlElementData, XmlList(Dom, String)) | |
| ## Get the XML attribute of the current node. | |
| # | |
| # Return a single XML attribute named Attribute from the current root Dom. | |
| # If the input Dom or Attribute is not valid, then an empty string is returned. | |
| # | |
| # @param Dom The root XML DOM object. | |
| # @param Attribute The name of Attribute. | |
| # | |
| # @revel Element A single XML element matching XPath style Sting. | |
| # | |
| def XmlAttribute(Dom, Attribute): | |
| try: | |
| return Dom.getAttribute(Attribute).strip() | |
| except: | |
| return '' | |
| ## Get the XML node name of the current node. | |
| # | |
| # Return a single XML node name from the current root Dom. | |
| # If the input Dom is not valid, then an empty string is returned. | |
| # | |
| # @param Dom The root XML DOM object. | |
| # | |
| # @revel Element A single XML element matching XPath style Sting. | |
| # | |
| def XmlNodeName(Dom): | |
| try: | |
| return Dom.nodeName.strip() | |
| except: | |
| return '' | |
| ## Parse an XML file. | |
| # | |
| # Parse the input XML file named FileName and return a XML DOM it stands for. | |
| # If the input File is not a valid XML file, then an empty string is returned. | |
| # | |
| # @param FileName The XML file name. | |
| # | |
| # @revel Dom The Dom object achieved from the XML file. | |
| # | |
| def XmlParseFile(FileName): | |
| try: | |
| XmlFile = open(FileName) | |
| Dom = xml.dom.minidom.parse(XmlFile) | |
| XmlFile.close() | |
| return Dom | |
| except Exception, X: | |
| print X | |
| return "" | |
| # This acts like the main() function for the script, unless it is 'import'ed | |
| # into another script. | |
| if __name__ == '__main__': | |
| # Nothing to do here. Could do some unit tests. | |
| A = CreateXmlElement('AAA', 'CCC', [['AAA', '111'], ['BBB', '222']], [['A', '1'], ['B', '2']]) | |
| B = CreateXmlElement('ZZZ', 'CCC', [['XXX', '111'], ['YYY', '222']], [['A', '1'], ['B', '2']]) | |
| C = CreateXmlList('DDD', 'EEE', [A, B], ['FFF', 'GGG']) | |
| print C.toprettyxml(indent = " ") | |
| pass |