summaryrefslogtreecommitdiff
path: root/Final/python/qpid/xmlutil.py
diff options
context:
space:
mode:
Diffstat (limited to 'Final/python/qpid/xmlutil.py')
-rw-r--r--Final/python/qpid/xmlutil.py119
1 files changed, 119 insertions, 0 deletions
diff --git a/Final/python/qpid/xmlutil.py b/Final/python/qpid/xmlutil.py
new file mode 100644
index 0000000000..585516b44f
--- /dev/null
+++ b/Final/python/qpid/xmlutil.py
@@ -0,0 +1,119 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+"""
+XML utilities used by spec.py
+"""
+
+import xml.sax
+from xml.sax.handler import ContentHandler
+
+def parse(file):
+ doc = Node("root")
+ xml.sax.parse(file, Builder(doc))
+ return doc
+
+class Node:
+
+ def __init__(self, name, attrs = None, text = None, parent = None):
+ self.name = name
+ self.attrs = attrs
+ self.text = text
+ self.parent = parent
+ self.children = []
+ if parent != None:
+ parent.children.append(self)
+
+ def get_bool(self, key, default = False):
+ v = self.get(key)
+ if v == None:
+ return default
+ else:
+ return bool(int(v))
+
+ def index(self):
+ if self.parent:
+ return self.parent.children.index(self)
+ else:
+ return 0
+
+ def has(self, key):
+ try:
+ result = self[key]
+ return True
+ except KeyError:
+ return False
+ except IndexError:
+ return False
+
+ def get(self, key, default = None):
+ if self.has(key):
+ return self[key]
+ else:
+ return default
+
+ def __getitem__(self, key):
+ if callable(key):
+ return filter(key, self.children)
+ else:
+ t = key.__class__
+ meth = "__get%s__" % t.__name__
+ if hasattr(self, meth):
+ return getattr(self, meth)(key)
+ else:
+ raise KeyError(key)
+
+ def __getstr__(self, name):
+ if name[:1] == "@":
+ return self.attrs[name[1:]]
+ else:
+ return self[lambda nd: nd.name == name]
+
+ def __getint__(self, index):
+ return self.children[index]
+
+ def __iter__(self):
+ return iter(self.children)
+
+ def path(self):
+ if self.parent == None:
+ return "/%s" % self.name
+ else:
+ return "%s/%s" % (self.parent.path(), self.name)
+
+class Builder(ContentHandler):
+
+ def __init__(self, start = None):
+ self.node = start
+
+ def __setitem__(self, element, type):
+ self.types[element] = type
+
+ def startElement(self, name, attrs):
+ self.node = Node(name, attrs, None, self.node)
+
+ def endElement(self, name):
+ self.node = self.node.parent
+
+ def characters(self, content):
+ if self.node.text == None:
+ self.node.text = content
+ else:
+ self.node.text += content
+