X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=Tools%2FPython%2FXmlRoutines.py;h=53f5aa8f6157057b24cdf4d965923be3859d6c0e;hb=243009a7bf0cbd4a40815343d132481031f128c2;hp=20671ea407dfdc5959f3ce0b391aade774bfe708;hpb=77afa5eb93159785953d700161914153b751706f;p=mirror_edk2.git
diff --git a/Tools/Python/XmlRoutines.py b/Tools/Python/XmlRoutines.py
index 20671ea407..53f5aa8f61 100755
--- a/Tools/Python/XmlRoutines.py
+++ b/Tools/Python/XmlRoutines.py
@@ -1,7 +1,16 @@
#!/usr/bin/env python
-# 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, 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
@@ -27,21 +36,103 @@ def XmlList(Dom, String):
def XmlElement (Dom, String):
"""Return a single element that matches the String which is XPath style syntax."""
try:
- return XmlList (Dom, String)[0].firstChild.data.strip(' ')
+ return XmlList (Dom, String)[0].firstChild.data.strip()
except:
return ''
def XmlElementData (Dom):
"""Get the text for this element."""
- return Dom.firstChild.data.strip(' ')
+ return Dom.firstChild.data.strip()
-def XmlAttribute (Dom, String):
- """Return a single attribute that named by String."""
+def XmlAttribute (Dom, AttName):
+ """Return a single attribute named AttName."""
try:
- return Dom.getAttribute(String)
+ 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 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 = '' + Tag + '>'
+ 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 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 False
+ Depth = 0
+ Dom = ParentNode
+ while Dom != None and Dom.nodeType != Dom.DOCUMENT_NODE:
+ Dom = Dom.parentNode
+ Depth += 1
+ if Dom == None:
+ return False
+ 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 True
+
+
# This acts like the main() function for the script, unless it is 'import'ed into another
# script.
if __name__ == '__main__':