class XmlNode:
def __init__(self, node, namespaces):
self.node = node
+ self.text = node.text
self.namespaces = namespaces
self.attrib = node.attrib
+
def xpath(self, xpath, namespaces=None):
if not namespaces:
namespaces = self.namespaces
- return self.node.xpath(xpath, namespaces=namespaces)
+ elems = self.node.xpath(xpath, namespaces=namespaces)
+ return [XmlNode(elem, namespaces) for elem in elems]
- def add_element(name, *args, **kwds):
- element = etree.SubElement(name, args, kwds)
+ def add_element(self, name, **kwds):
+ element = etree.SubElement(self.node, name, **kwds)
return XmlNode(element, self.namespaces)
def remove_elements(name):
parent = element.getparent()
parent.remove(element)
+ def remove(element):
+ self.node.remove(element)
+
def set(self, key, value):
self.node.set(key, value)
def unset(self, key):
del self.node.attrib[key]
-
+
+ def iterchildren(self):
+ return self.node.iterchildren()
+
def toxml(self):
return etree.tostring(self.node, encoding='UTF-8', pretty_print=True)
self.parse_xml(xml)
if isinstance(xml, XmlNode):
self.root = xml
- self.namespces = xml.namespaces
+ self.namespaces = xml.namespaces
elif isinstance(xml, etree._ElementTree) or isinstance(xml, etree._Element):
self.parse_xml(etree.tostring(xml))
node.remove_attribute(name)
- def add_element(self, name, attrs={}, parent=None, text=""):
+ def add_element(self, name, **kwds):
"""
Wrapper around etree.SubElement(). Adds an element to
specified parent node. Adds element to root node is parent is
not specified.
"""
- if parent == None:
- parent = self.root
- element = etree.SubElement(parent, name)
- if text:
- element.text = text
- if isinstance(attrs, dict):
- for attr in attrs:
- element.set(attr, attrs[attr])
- return XmlNode(element, self.namespaces)
+ parent = self.root
+ xmlnode = parent.add_element(name, *kwds)
+ return xmlnode
def remove_elements(self, name, node = None):
"""