root / ncclient / content.py @ 2acc860a
History | View | Annotate | Download (3.9 kB)
1 | a4850088 | Shikhar Bhushan | # Copyright 2009 Shikhar Bhushan
|
---|---|---|---|
2 | a4850088 | Shikhar Bhushan | #
|
3 | a4850088 | Shikhar Bhushan | # Licensed under the Apache License, Version 2.0 (the "License");
|
4 | a4850088 | Shikhar Bhushan | # you may not use this file except in compliance with the License.
|
5 | a4850088 | Shikhar Bhushan | # You may obtain a copy of the License at
|
6 | a4850088 | Shikhar Bhushan | #
|
7 | a4850088 | Shikhar Bhushan | # http://www.apache.org/licenses/LICENSE-2.0
|
8 | a4850088 | Shikhar Bhushan | #
|
9 | a4850088 | Shikhar Bhushan | # Unless required by applicable law or agreed to in writing, software
|
10 | a4850088 | Shikhar Bhushan | # distributed under the License is distributed on an "AS IS" BASIS,
|
11 | a4850088 | Shikhar Bhushan | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12 | a4850088 | Shikhar Bhushan | # See the License for the specific language governing permissions and
|
13 | a4850088 | Shikhar Bhushan | # limitations under the License.
|
14 | a4850088 | Shikhar Bhushan | |
15 | ee4bb099 | Shikhar Bhushan | import logging |
16 | 38a9b062 | Shikhar Bhushan | from xml.etree import cElementTree as ElementTree |
17 | 2acc860a | Shikhar Bhushan | from cStringIO import StringIO |
18 | 38a9b062 | Shikhar Bhushan | |
19 | ee4bb099 | Shikhar Bhushan | logger = logging.getLogger('ncclient.content')
|
20 | a4850088 | Shikhar Bhushan | |
21 | a4850088 | Shikhar Bhushan | |
22 | 2acc860a | Shikhar Bhushan | def qualify(tag, ns=None): |
23 | 2acc860a | Shikhar Bhushan | if ns is None: |
24 | 2acc860a | Shikhar Bhushan | return tag
|
25 | 2acc860a | Shikhar Bhushan | else:
|
26 | 2acc860a | Shikhar Bhushan | return '{%s}%s' % (ns, tag) |
27 | a4850088 | Shikhar Bhushan | _ = qualify |
28 | a4850088 | Shikhar Bhushan | |
29 | 2acc860a | Shikhar Bhushan | |
30 | 2acc860a | Shikhar Bhushan | class RootElementParser: |
31 | 2acc860a | Shikhar Bhushan | |
32 | 2acc860a | Shikhar Bhushan | '''Parse the root element of an XML document. The tag and namespace of
|
33 | 2acc860a | Shikhar Bhushan | recognized elements, and attributes of interest can be customized.
|
34 | 2acc860a | Shikhar Bhushan |
|
35 | 2acc860a | Shikhar Bhushan | RootElementParser does not parse any sub-elements.
|
36 | 2acc860a | Shikhar Bhushan | '''
|
37 | 2acc860a | Shikhar Bhushan | |
38 | 2acc860a | Shikhar Bhushan | def __init__(self, recognize=[]): |
39 | 2acc860a | Shikhar Bhushan | self._recognize = recognize
|
40 | 2acc860a | Shikhar Bhushan | |
41 | 2acc860a | Shikhar Bhushan | def recognize(self, element): |
42 | 2acc860a | Shikhar Bhushan | '''Specify an element that should be successfully parsed.
|
43 | 2acc860a | Shikhar Bhushan |
|
44 | 2acc860a | Shikhar Bhushan | element should be a string that represents a qualified name of the form
|
45 | 2acc860a | Shikhar Bhushan | *{namespace}tag*.
|
46 | 2acc860a | Shikhar Bhushan | '''
|
47 | 2acc860a | Shikhar Bhushan | self._recognize.append((element, attrs))
|
48 | 2acc860a | Shikhar Bhushan | |
49 | 2acc860a | Shikhar Bhushan | def parse(self, raw): |
50 | 2acc860a | Shikhar Bhushan | '''Parse the root element from a string representing an XML document.
|
51 | 2acc860a | Shikhar Bhushan |
|
52 | 2acc860a | Shikhar Bhushan | Returns a (tag, attributes) tuple. tag is a string representing
|
53 | 2acc860a | Shikhar Bhushan | the qualified name of the recognized element. attributes is a
|
54 | 2acc860a | Shikhar Bhushan | {'attr': value} dictionary.
|
55 | 2acc860a | Shikhar Bhushan | '''
|
56 | 2acc860a | Shikhar Bhushan | fp = StringIO(raw) |
57 | 2acc860a | Shikhar Bhushan | for event, element in ElementTree.iterparse(fp, events=('start',)): |
58 | 2acc860a | Shikhar Bhushan | for e in self._recognize: |
59 | 2acc860a | Shikhar Bhushan | if element.tag == e:
|
60 | 2acc860a | Shikhar Bhushan | return (element.tag, element.attrib)
|
61 | 2acc860a | Shikhar Bhushan | break
|
62 | 2acc860a | Shikhar Bhushan | return None |
63 | 2acc860a | Shikhar Bhushan | |
64 | 2acc860a | Shikhar Bhushan | |
65 | 2acc860a | Shikhar Bhushan | ###########
|
66 | 2acc860a | Shikhar Bhushan | |
67 | 2acc860a | Shikhar Bhushan | class XMLBuilder: |
68 | 2acc860a | Shikhar Bhushan | |
69 | 2acc860a | Shikhar Bhushan | @staticmethod
|
70 | 2acc860a | Shikhar Bhushan | def _element(node): |
71 | 2acc860a | Shikhar Bhushan | element = ElementTree.Element( _(node.get('tag'),
|
72 | 2acc860a | Shikhar Bhushan | node.get('namespace', None)), |
73 | 2acc860a | Shikhar Bhushan | node.get('attributes', {}))
|
74 | 2acc860a | Shikhar Bhushan | if node.has_key('children'): |
75 | 2acc860a | Shikhar Bhushan | for child in node['children']: |
76 | 2acc860a | Shikhar Bhushan | element.append(_make_element(child)) |
77 | ee4bb099 | Shikhar Bhushan | else:
|
78 | 2acc860a | Shikhar Bhushan | return element
|
79 | 2acc860a | Shikhar Bhushan | |
80 | 2acc860a | Shikhar Bhushan | @staticmethod
|
81 | 2acc860a | Shikhar Bhushan | def _etree(tree_dict): |
82 | 2acc860a | Shikhar Bhushan | return ElementTree.ElementTree(XMLBuilder._element(tree_dict))
|
83 | 2acc860a | Shikhar Bhushan | |
84 | 2acc860a | Shikhar Bhushan | @staticmethod
|
85 | 2acc860a | Shikhar Bhushan | def to_xml(tree_dict, encoding='utf-8'): |
86 | 2acc860a | Shikhar Bhushan | fp = StringIO() |
87 | 2acc860a | Shikhar Bhushan | self._etree(tree_dict).write(fp, encoding)
|
88 | 2acc860a | Shikhar Bhushan | return fp.get_value()
|
89 | 2acc860a | Shikhar Bhushan | |
90 | 2acc860a | Shikhar Bhushan | |
91 | 2acc860a | Shikhar Bhushan | ### Hello exchange
|
92 | 2acc860a | Shikhar Bhushan | |
93 | 2acc860a | Shikhar Bhushan | class Hello: |
94 | 2acc860a | Shikhar Bhushan | |
95 | 2acc860a | Shikhar Bhushan | NS = 'urn:ietf:params:xml:ns:netconf:base:1.0'
|
96 | 2acc860a | Shikhar Bhushan | |
97 | 2acc860a | Shikhar Bhushan | @staticmethod
|
98 | 2acc860a | Shikhar Bhushan | def build(capabilities, encoding='utf-8'): |
99 | 2acc860a | Shikhar Bhushan | hello = ElementTree.Element(_('hello', Hello.NS))
|
100 | 2acc860a | Shikhar Bhushan | caps = ElementTree.Element('capabilities')
|
101 | 2acc860a | Shikhar Bhushan | for uri in capabilities: |
102 | 2acc860a | Shikhar Bhushan | cap = ElementTree.Element('capability')
|
103 | 2acc860a | Shikhar Bhushan | cap.text = uri |
104 | 2acc860a | Shikhar Bhushan | caps.append(cap) |
105 | 2acc860a | Shikhar Bhushan | hello.append(caps) |
106 | 2acc860a | Shikhar Bhushan | tree = ElementTree.ElementTree(hello) |
107 | 2acc860a | Shikhar Bhushan | fp = StringIO() |
108 | 2acc860a | Shikhar Bhushan | tree.write(fp, encoding) |
109 | 2acc860a | Shikhar Bhushan | return fp.getvalue()
|
110 | 2acc860a | Shikhar Bhushan | |
111 | 2acc860a | Shikhar Bhushan | @staticmethod
|
112 | 2acc860a | Shikhar Bhushan | def parse(raw): |
113 | 2acc860a | Shikhar Bhushan | 'Returns tuple of (session-id, ["capability_uri", ...])'
|
114 | 2acc860a | Shikhar Bhushan | id, capabilities = 0, [] |
115 | 2acc860a | Shikhar Bhushan | root = ElementTree.fromstring(raw) |
116 | 2acc860a | Shikhar Bhushan | if root.tag == _('hello', Hello.NS): |
117 | 2acc860a | Shikhar Bhushan | for child in root.getchildren(): |
118 | 2acc860a | Shikhar Bhushan | if child.tag == _('session-id', Hello.NS): |
119 | 2acc860a | Shikhar Bhushan | id = int(child.text)
|
120 | 2acc860a | Shikhar Bhushan | elif child.tag == _('capabilities', Hello.NS): |
121 | 2acc860a | Shikhar Bhushan | for cap in child.getiterator(_('capability', Hello.NS)): |
122 | 2acc860a | Shikhar Bhushan | capabilities.append(cap.text) |
123 | 2acc860a | Shikhar Bhushan | return id, capabilities |