comparison libervia/frontends/jp/xml_tools.py @ 4074:26b7ed2817da

refactoring: rename `sat_frontends` to `libervia.frontends`
author Goffi <goffi@goffi.org>
date Fri, 02 Jun 2023 14:12:38 +0200
parents sat_frontends/jp/xml_tools.py@4b842c1fb686
children
comparison
equal deleted inserted replaced
4073:7c5654c54fed 4074:26b7ed2817da
1 #!/usr/bin/env python3
2
3
4 # jp: a SàT command line tool
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
6
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
20 from libervia.backend.core.i18n import _
21 from libervia.frontends.jp.constants import Const as C
22
23 def etree_parse(cmd, raw_xml, reraise=False):
24 """import lxml and parse raw XML
25
26 @param cmd(CommandBase): current command instance
27 @param raw_xml(file, str): an XML bytestring, string or file-like object
28 @param reraise(bool): if True, re raise exception on parse error instead of doing a
29 parser.error (which terminate the execution)
30 @return (tuple(etree.Element, module): parsed element, etree module
31 """
32 try:
33 from lxml import etree
34 except ImportError:
35 cmd.disp(
36 'lxml module must be installed, please install it with "pip install lxml"',
37 error=True,
38 )
39 cmd.host.quit(C.EXIT_ERROR)
40 try:
41 if isinstance(raw_xml, str):
42 parser = etree.XMLParser(remove_blank_text=True)
43 element = etree.fromstring(raw_xml, parser)
44 else:
45 element = etree.parse(raw_xml).getroot()
46 except Exception as e:
47 if reraise:
48 raise e
49 cmd.parser.error(
50 _("Can't parse the payload XML in input: {msg}").format(msg=e)
51 )
52 return element, etree
53
54 def get_payload(cmd, element):
55 """Retrieve payload element and exit with and error if not found
56
57 @param element(etree.Element): root element
58 @return element(etree.Element): payload element
59 """
60 if element.tag in ("item", "{http://jabber.org/protocol/pubsub}item"):
61 if len(element) > 1:
62 cmd.disp(_("<item> can only have one child element (the payload)"),
63 error=True)
64 cmd.host.quit(C.EXIT_DATA_ERROR)
65 element = element[0]
66 return element