components now ignore namespaces in matching completely for server compatibility

This commit is contained in:
Nathan Fritz 2009-07-11 19:31:20 +00:00
parent a1ece44368
commit 226f719597
3 changed files with 27 additions and 2 deletions

View file

@ -22,6 +22,14 @@
from __future__ import absolute_import
from . basexmpp import basexmpp
from xml.etree import cElementTree as ET
# some servers use different namespaces for components -- this is a hack, but is there for compatibility
import xmlstream.matcher.xmlmask
import xmlstream.matcher.xpath
xmlstream.matcher.xmlmask.ignore_ns = True
xmlstream.matcher.xpath.ignore_ns = True
# ----------
from . xmlstream.xmlstream import XMLStream
from . xmlstream.xmlstream import RestartStream
from . xmlstream.matcher.xmlmask import MatchXMLMask

View file

@ -2,6 +2,8 @@ from . import base
from xml.etree import cElementTree
from xml.parsers.expat import ExpatError
ignore_ns = False
class MatchXMLMask(base.MatcherBase):
def __init__(self, criteria):
@ -19,6 +21,7 @@ class MatchXMLMask(base.MatcherBase):
def maskcmp(self, source, maskobj, use_ns=False, default_ns='__no_ns__'):
"""maskcmp(xmlobj, maskobj):
Compare etree xml object to etree xml object mask"""
use_ns = not ignore_ns
#TODO require namespaces
if source == None: #if element not found (happens during recursive check below)
return False

View file

@ -1,11 +1,25 @@
from . import base
from xml.etree import cElementTree
ignore_ns = False
class MatchXPath(base.MatcherBase):
def match(self, xml):
x = cElementTree.Element('x')
x.append(xml)
if not ignore_ns:
if x.find(self._criteria) is not None:
return True
return False
else:
criteria = [c.split('}')[-1] for c in self._criteria.split('/')]
xml = x
for tag in criteria:
children = [c.tag.split('}')[-1] for c in xml.getchildren()]
try:
idx = children.index(tag)
except ValueError:
return False
xml = xml.getchildren()[idx]
return True