Line 0
Link Here
|
|
|
1 |
# Copyright 2020 Gentoo Authors |
2 |
# Distributed under the terms of the GNU General Public License v2 |
3 |
|
4 |
import io |
5 |
import xml.sax |
6 |
import xml.sax.xmlreader |
7 |
|
8 |
def _make_parser(*, content_handler=None, dtd_handler=None, entity_resolver=None, error_handler=None, locale=None, features=None, properties=None): |
9 |
parser = xml.sax.make_parser() |
10 |
|
11 |
if content_handler is not None: |
12 |
parser.setContentHandler(content_handler) |
13 |
if dtd_handler is not None: |
14 |
parser.setDTDHandler(dtd_handler) |
15 |
if entity_resolver is not None: |
16 |
parser.setEntityResolver(entity_resolver) |
17 |
if error_handler is not None: |
18 |
parser.setErrorHandler(error_handler) |
19 |
if locale is not None: |
20 |
parser.setLocale(locale) |
21 |
if features is not None: |
22 |
for feature, value in features.items(): |
23 |
parser.setFeature(feature, value) |
24 |
if properties is not None: |
25 |
for property, value in properties.items(): |
26 |
parser.setProperty(property, value) |
27 |
|
28 |
return parser |
29 |
|
30 |
def parse(source, *, content_handler=None, dtd_handler=None, entity_resolver=None, error_handler=None, locale=None, features=None, properties=None): |
31 |
parser = _make_parser(content_handler=content_handler, dtd_handler=dtd_handler, entity_resolver=entity_resolver, error_handler=error_handler, locale=locale, features=features, properties=properties) |
32 |
|
33 |
parser.parse(source) |
34 |
|
35 |
def parse_string(string, *, content_handler=None, dtd_handler=None, entity_resolver=None, error_handler=None, locale=None, features=None, properties=None): |
36 |
parser = _make_parser(content_handler=content_handler, dtd_handler=dtd_handler, entity_resolver=entity_resolver, error_handler=error_handler, locale=locale, features=features, properties=properties) |
37 |
|
38 |
inputsource = xml.sax.xmlreader.InputSource() |
39 |
if isinstance(string, str): |
40 |
inputsource.setCharacterStream(io.StringIO(string)) |
41 |
else: |
42 |
inputsource.setByteStream(io.BytesIO(string)) |
43 |
|
44 |
parser.parse(inputsource) |