cdef object _find_id_attributes
def XMLID(text, parser=None, *, base_url=None):
u"""XMLID(text, parser=None, base_url=None)
Parse the text and return a tuple (root node, ID dictionary). The root
node is the same as returned by the XML() function. The dictionary
contains string-element pairs. The dictionary keys are the values of 'id'
attributes. The elements referenced by the ID are stored as dictionary
values.
"""
cdef dict dic
global _find_id_attributes
if _find_id_attributes is None:
_find_id_attributes = XPath(u'//*[string(@id)]')
# ElementTree compatible implementation: parse and look for 'id' attributes
root = XML(text, parser, base_url=base_url)
dic = {}
for elem in _find_id_attributes(root):
dic[elem.get(u'id')] = elem
return root, dic
def XMLDTDID(text, parser=None, *, base_url=None):
u"""XMLDTDID(text, parser=None, base_url=None)
Parse the text and return a tuple (root node, ID dictionary). The root
node is the same as returned by the XML() function. The dictionary
contains string-element pairs. The dictionary keys are the values of ID
attributes as defined by the DTD. The elements referenced by the ID are
stored as dictionary values.
Note that you must not modify the XML tree if you use the ID dictionary.
The results are undefined.
"""
cdef _Element root
root = XML(text, parser, base_url=base_url)
# xml:id spec compatible implementation: use DTD ID attributes from libxml2
if root._doc._c_doc.ids is NULL:
return root, {}
else:
return root, _IDDict(root)
def parseid(source, parser=None, *, base_url=None):
u"""parseid(source, parser=None)
Parses the source into a tuple containing an ElementTree object and an
ID dictionary. If no parser is provided as second argument, the default
parser is used.
Note that you must not modify the XML tree if you use the ID dictionary.
The results are undefined.
"""
cdef _Document doc
doc = _parseDocument(source, parser, base_url)
return _elementTreeFactory(doc, None), _IDDict(doc)
cdef class _IDDict:
u"""IDDict(self, etree)
A dictionary-like proxy class that mapps ID attributes to elements.
The dictionary must be instantiated with the root element of a parsed XML
document, otherwise the behaviour is undefined. Elements and XML trees
that were created or modified 'by hand' are not supported.
"""
cdef _Document _doc
cdef object _keys
cdef object _items
def __cinit__(self, etree):
cdef _Document doc
doc = _documentOrRaise(etree)
if doc._c_doc.ids is NULL:
raise ValueError, u"No ID dictionary available."
self._doc = doc
self._keys = None
self._items = None
def copy(self):
return _IDDict(self._doc)
def __getitem__(self, id_name):
cdef tree.xmlHashTable* c_ids
cdef tree.xmlID* c_id
cdef xmlAttr* c_attr
c_ids = self._doc._c_doc.ids
id_utf = _utf8(id_name)
c_id = collect_list).append(funicode(name))