6 regex = r"([^\/^\[]+)(\[([^\]]+)\])?"
7 def __init__(self, expr):
8 matches = re.finditer(XPathComponent.regex, expr, re.DOTALL | re.IGNORECASE)
10 self.name = match.group(1)
11 tmp = match.group(3) if len(match.groups())>2 else None
12 self.filter = tmp.split(',') if tmp is not None else []
14 def equals(self, comp, ignoreFilter=False) -> bool:
16 return self.name == comp.name
17 if self.name == comp.name:
18 return set(self.filter) == set(comp.filter)
21 def setFilter(self, f, v):
22 self.filter.append('{}={}'.format(f,v))
24 def hasFilter(self, propertyName):
25 search=propertyName+'='
26 for filter in self.filter:
27 if filter.startswith(search):
31 def __str__(self) -> str:
32 return "XPathComponent[name={}, filter={}]".format(self.name, self.filter)
36 def __init__(self, expr=None):
38 tmp = expr.split('/') if expr is not None else []
40 if len(tmp)>0 and len(tmp[0])==0:
43 self.components.append(XPathComponent(x))
45 def add(self, c: str) -> XPathComponent:
47 self.components.append(xc)
50 def remove(self, c: str) -> bool:
51 if self.components[len(self.components)-1].equals(XPathComponent(c), True):
56 def parentParamIsNeeded(self, xp, paramName) -> bool:
57 for i in range(len(xp.components)):
58 if i>=len(self.components):
60 if not self.components[i].equals(xp.components[i], True):
62 return self.components[len(xp.components)-1].hasFilter(paramName)
64 def equals(self, path, ignoreFilter=False) -> bool:
65 if len(self.components) != len(path.components):
68 for i in range(len(self.components)):
69 if not self.components[i].equals(path.components[i], ignoreFilter):
73 def lastname(self) -> str:
75 return tmp.name if tmp is not None else ""
77 def last(self, off=0) -> XPathComponent:
78 return self.components[len(self.components)-1-off] if len(self.components)>off else None
80 def subpath(self, off=0):
82 for i in range(len(self.components)-off):
83 tmp.components.append(self.components[i])