#!/usr/bin/env python # Copyright (c) 2007, Intel Corporation # All rights reserved. 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. """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.""" import xml.dom.minidom def XmlList(Dom, String): """Get a list of XML Elements using XPath style syntax.""" 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 def XmlNode (Dom, String): """Return a single node that matches the String which is XPath style syntax.""" 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 "" def XmlElement (Dom, String): """Return a single element that matches the String which is XPath style syntax.""" try: return XmlNode (Dom, String).firstChild.data.strip() except: return '' def XmlElementData (Dom): """Get the text for this element.""" if Dom == None or Dom == '' or Dom.firstChild == None: return '' return Dom.firstChild.data.strip() def XmlAttribute (Dom, AttName): """Return a single attribute named AttName.""" if Dom == None or Dom == '': return '' try: return Dom.getAttribute(AttName) except: return '' def XmlTopTag(Dom): """Return the name of the Root or top tag in the XML tree.""" return Dom.firstChild.nodeName def XmlParseFile (FileName): """Parse an XML file into a DOM and return the DOM.""" try: f = open(FileName, 'r') Dom = xml.dom.minidom.parse(f) f.close() return Dom except: return xml.dom.minidom.parseString('') def XmlParseString (Str): """Parse an XML string into a DOM and return the DOM.""" try: return xml.dom.minidom.parseString(Str) except: return xml.dom.minidom.parseString('') def XmlParseFileSection (FileName, Tag): """Parse a section of an XML file into a DOM(Document Object Model) and return the DOM.""" try: f = open(FileName, 'r') except: return xml.dom.minidom.parseString('') Start = '<' + Tag End = '' File = '' while File.find(Start) < 0 or File.find(End) < 0: Section = f.read(0x1000) if Section == '': break File += Section f.close() if File.find(Start) < 0 or File.find(End) < 0: return xml.dom.minidom.parseString('') File = File[File.find(Start):File.find(End)+len(End)] try: return xml.dom.minidom.parseString(File) except: return xml.dom.minidom.parseString('') def XmlParseStringSection (XmlString, Tag): """Parse a section of an XML string into a DOM(Document Object Model) and return the DOM.""" Start = '<' + Tag End = '' File = XmlString if File.find(Start) < 0 or File.find(End) < 0: return xml.dom.minidom.parseString('') File = File[File.find(Start):File.find(End)+len(End)] try: return xml.dom.minidom.parseString(File) except: return xml.dom.minidom.parseString('') def XmlSaveFile (Dom, FileName, Encoding='UTF-8'): """Save a DOM(Document Object Model) into an XML file.""" try: f = open(FileName, 'w') f.write(Dom.toxml(Encoding).replace('"','"').replace('>','>')) f.close() return True except: return False def XmlRemoveElement(Node): """Remove an element node from DOM(Document Object Model) tree.""" ParentNode = Node.parentNode if ParentNode == None: return False PreviousSibling = Node.previousSibling while PreviousSibling != None and PreviousSibling.nodeType == PreviousSibling.TEXT_NODE and PreviousSibling.data.strip() == '': Temp = PreviousSibling PreviousSibling = PreviousSibling.previousSibling ParentNode.removeChild(Temp) ParentNode.removeChild(Node) return True def XmlAppendChildElement(ParentNode, TagName, ElementText='', AttributeDictionary = {}): """Add a child element to a DOM(Document Object Model) tree with optional Attributes.""" TagName = TagName.strip() if TagName == '': return None Depth = 0 Dom = ParentNode while Dom != None and Dom.nodeType != Dom.DOCUMENT_NODE: Dom = Dom.parentNode Depth += 1 if Dom == None: return None ParentNode.appendChild(Dom.createTextNode('\n%*s' % (Depth * 2, ''))) ElementNode = Dom.createElement(TagName) if ElementText != '': ElementNode.appendChild(Dom.createTextNode(ElementText)) for Item in AttributeDictionary: ElementNode.setAttribute(Item, AttributeDictionary[Item]) ParentNode.appendChild(ElementNode) return ElementNode # 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. pass