(elem, default_namespace=None)
| 802 | yield file.write, encoding |
| 803 | |
| 804 | def _namespaces(elem, default_namespace=None): |
| 805 | # identify namespaces used in this tree |
| 806 | |
| 807 | # maps qnames to *encoded* prefix:local names |
| 808 | qnames = {None: None} |
| 809 | |
| 810 | # maps uri:s to prefixes |
| 811 | namespaces = {} |
| 812 | if default_namespace: |
| 813 | namespaces[default_namespace] = "" |
| 814 | |
| 815 | def add_qname(qname): |
| 816 | # calculate serialized qname representation |
| 817 | try: |
| 818 | if qname[:1] == "{": |
| 819 | uri, tag = qname[1:].rsplit("}", 1) |
| 820 | prefix = namespaces.get(uri) |
| 821 | if prefix is None: |
| 822 | prefix = _namespace_map.get(uri) |
| 823 | if prefix is None: |
| 824 | prefix = "ns%d" % len(namespaces) |
| 825 | if prefix != "xml": |
| 826 | namespaces[uri] = prefix |
| 827 | if prefix: |
| 828 | qnames[qname] = "%s:%s" % (prefix, tag) |
| 829 | else: |
| 830 | qnames[qname] = tag # default element |
| 831 | else: |
| 832 | if default_namespace: |
| 833 | # FIXME: can this be handled in XML 1.0? |
| 834 | raise ValueError( |
| 835 | "cannot use non-qualified names with " |
| 836 | "default_namespace option" |
| 837 | ) |
| 838 | qnames[qname] = qname |
| 839 | except TypeError: |
| 840 | _raise_serialization_error(qname) |
| 841 | |
| 842 | # populate qname and namespaces table |
| 843 | for elem in elem.iter(): |
| 844 | tag = elem.tag |
| 845 | if isinstance(tag, QName): |
| 846 | if tag.text not in qnames: |
| 847 | add_qname(tag.text) |
| 848 | elif isinstance(tag, str): |
| 849 | if tag not in qnames: |
| 850 | add_qname(tag) |
| 851 | elif tag is not None and tag is not Comment and tag is not PI: |
| 852 | _raise_serialization_error(tag) |
| 853 | for key, value in elem.items(): |
| 854 | if isinstance(key, QName): |
| 855 | key = key.text |
| 856 | if key not in qnames: |
| 857 | add_qname(key) |
| 858 | if isinstance(value, QName) and value.text not in qnames: |
| 859 | add_qname(value.text) |
| 860 | text = elem.text |
| 861 | if isinstance(text, QName) and text.text not in qnames: |
no test coverage detected