1 # Copyright 2009 Shikhar Bhushan
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
17 from xml.etree import cElementTree as ET
19 ################################################################################
22 BASE_NS = 'urn:ietf:params:xml:ns:netconf:base:1.0'
24 # cisco returns incorrectly namespaced xml
25 CISCO_BS = 'urn:ietf:params:netconf:base:1.0'
27 # we'd like BASE_NS to be prefixed as "netconf"
29 register_namespace = ET.register_namespace
30 except AttributeError:
31 def register_namespace(prefix, uri):
32 from xml.etree import ElementTree
33 # cElementTree uses ElementTree's _namespace_map, so that's ok
34 ElementTree._namespace_map[uri] = prefix
36 register_namespace('netconf', BASE_NS)
38 qualify = lambda tag, ns: '{%s}%s' % (namespace, tag)
40 unqualify = lambda tag: tag[tag.rfind('}')+1:]
43 ################################################################################
44 # Build XML using Python data structures :-)
47 """Build an ElementTree.Element instance from an XML tree specification
48 based on nested dictionaries. TODO: describe spec
51 def __init__(self, spec):
53 self._root = TreeBuilder.build(spec)
55 def to_string(self, encoding='utf-8'):
57 xml = ET.tostring(self._root, encoding)
58 # some etree versions don't always include xml decl
59 # this is a problem with some devices
60 if not xml.startswith('<?xml'):
61 return '<?xml version="1.0" encoding="%s"?>%s' % (encoding, xml)
73 if spec.has_key('tag'):
74 ele = ET.Element(spec.get('tag'), spec.get('attributes', {}))
75 ele.text = spec.get('text', '')
76 children = spec.get('children', [])
77 if isinstance(children, dict):
79 for child in children:
80 ele.append(TreeBuilder.build(child))
82 elif spec.has_key('comment'):
83 return ET.Comment(spec.get('comment'))
85 raise ValueError('Invalid tree spec')
87 ################################################################################