4 spaces per indentation level, no tabs, no trailing whitespace, and a single newline at end of each file.
166 lines
4.8 KiB
Python
166 lines
4.8 KiB
Python
"""
|
|
This module provides the Python interface to C++ class XML_Node.
|
|
"""
|
|
|
|
import _cantera
|
|
import types
|
|
import tempfile
|
|
import string
|
|
import exceptions
|
|
|
|
class XML_Node:
|
|
"""A node in an XML tree."""
|
|
def __init__(self, name="--", src="", wrap=0, root=None, preprocess=0, debug=0):
|
|
"""
|
|
Return an instance representing a node in an XML tree.
|
|
|
|
If 'src' is specified, then the XML tree found in file 'src' is
|
|
constructed, and this node forms the root of the tree. The XML tree
|
|
is saved, and a second call with the same value for 'src' will use
|
|
the XML tree already read in, instead of reading it in again.
|
|
|
|
If 'wrap' is greater than zero, then only a Python wrapper is
|
|
created - no new kernel object results.
|
|
"""
|
|
self._xml_id = 0
|
|
self.wrap = wrap
|
|
|
|
# create a wrapper for an existing kernel object
|
|
if wrap > 0:
|
|
self._xml_id = wrap
|
|
|
|
# create an XML tree by parsing a file, and possibly
|
|
# preprocessing it first
|
|
elif src:
|
|
self._xml_id = _cantera.xml_get_XML_File(src, debug)
|
|
self.wrap = 1 # disable deleting
|
|
|
|
# create a new empty node
|
|
else:
|
|
self._xml_id = _cantera.xml_new(name)
|
|
|
|
def __del__(self):
|
|
"""Delete the node. Does nothing if this node is only a wrapper."""
|
|
if not self.wrap:
|
|
_cantera.xml_del(self._xml_id)
|
|
|
|
def tag(self):
|
|
return _cantera.xml_tag(self._xml_id)
|
|
|
|
def id(self):
|
|
"""Return the id attribute if one exists, or else the empty string."""
|
|
try:
|
|
return self['id']
|
|
except:
|
|
return ''
|
|
|
|
def nChildren(self):
|
|
"""Number of child elements."""
|
|
return _cantera.xml_nChildren(self._xml_id)
|
|
|
|
def children(self,tag=""):
|
|
"""Return a list of all child elements, or just those with a specified
|
|
tag name.
|
|
"""
|
|
nch = self.nChildren()
|
|
children = []
|
|
for n in range(nch):
|
|
m = _cantera.xml_childbynumber(self._xml_id, n)
|
|
ch = XML_Node(wrap = m)
|
|
if (tag == "" or ch.tag() == tag):
|
|
children.append(ch)
|
|
return children
|
|
|
|
def removeChild(self, child):
|
|
"""Remove a child and all its descendants."""
|
|
_cantera.xml_removeChild(self._xml_id, child._xml_id)
|
|
|
|
def addChild(self, name, value=""):
|
|
"""Add a child with tag 'name', and set its value if the value
|
|
parameter is supplied."""
|
|
if type(value) <> types.StringType:
|
|
v = `value`
|
|
else:
|
|
v = value
|
|
m = _cantera.xml_addChild(self._xml_id, name, v)
|
|
return XML_Node(wrap = m)
|
|
|
|
def hasAttrib(self, key):
|
|
x = self.attrib(key)
|
|
if x: return 1
|
|
else: return 0
|
|
|
|
def attrib(self, key):
|
|
"""Return attribute 'key', or the empty string if this attribute
|
|
does not exist."""
|
|
try:
|
|
return _cantera.xml_attrib(self._xml_id, key)
|
|
except:
|
|
return ''
|
|
|
|
def addAttrib(self, key, value):
|
|
"""Add attribute 'key' with value 'value'."""
|
|
_cantera.xml_addAttrib(self._xml_id, key, value)
|
|
|
|
def addComment(self, comment):
|
|
"""Add a comment."""
|
|
_cantera.xml_addComment(self._xml_id, comment)
|
|
|
|
def value(self, loc=""):
|
|
"""Return the value of this node, or, if
|
|
the loc argument is supplied, of the node with relative
|
|
address 'loc'."""
|
|
if loc:
|
|
node = self.child(loc)
|
|
return node.value()
|
|
else:
|
|
return _cantera.xml_value(self._xml_id)
|
|
|
|
def child(self, loc="", id="", name=""):
|
|
if loc:
|
|
m = _cantera.xml_child(self._xml_id, loc)
|
|
elif id:
|
|
m = _cantera.xml_findID(self._xml_id, id)
|
|
elif name:
|
|
m = _cantera.xml_findByName(self._xml_id, name)
|
|
|
|
ch = XML_Node(wrap=m)
|
|
return ch
|
|
|
|
def __getitem__(self, key):
|
|
"""Get an attribute using the syntax node[key]"""
|
|
return self.attrib(key)
|
|
|
|
def __setitem__(self, key, value):
|
|
"""Set a new attribute using the syntax node[key] = value."""
|
|
return self.addAttrib(key, value)
|
|
|
|
def __int__(self):
|
|
"""Conversion to integer."""
|
|
return self._xml_id
|
|
|
|
def __call__(self, loc=''):
|
|
"""Get the value using the syntax node(loc)."""
|
|
return self.value(loc)
|
|
|
|
def write(self, file):
|
|
_cantera.xml_write(self._xml_id, file)
|
|
|
|
def __repr__(self):
|
|
tmp = tempfile.mktemp('.xml')
|
|
self.write(tmp)
|
|
f = open(tmp)
|
|
lines = f.readlines()
|
|
f.close()
|
|
s = ''
|
|
for line in lines:
|
|
s += line
|
|
return s
|
|
|
|
def clear_XML():
|
|
_cantera.xml_clear()
|
|
|
|
|
|
def getFloatArray(node, convert_units=0):
|
|
sz = int(node['size'])
|
|
return _cantera.ctml_getFloatArray(node._xml_id, convert_units, sz)
|