caselawclient.xml_helpers

 1from typing import Dict, Optional
 2
 3from lxml import etree
 4
 5DEFAULT_NAMESPACES = {
 6    "uk": "https://caselaw.nationalarchives.gov.uk/akn",
 7    "akn": "http://docs.oasis-open.org/legaldocml/ns/akn/3.0",
 8}
 9
10# _Element is the only class lxml exposes, so need to use the private class for typing
11Element = etree._Element  # noqa: SLF001
12
13
14def get_xpath_nodes(
15    node: Element,
16    path: str,
17    namespaces: Optional[Dict[str, str]] = None,
18) -> list[Element]:
19    result = node.xpath(path, namespaces=namespaces)
20
21    if not isinstance(result, list) or not all(isinstance(x, Element) for x in result):
22        raise TypeError(f"Expected to return list[Element], got {type(result).__name__}")
23
24    return result
25
26
27def get_xpath_match_string(
28    node: Element,
29    path: str,
30    namespaces: Optional[Dict[str, str]] = None,
31    fallback: str = "",
32) -> str:
33    return str((node.xpath(path, namespaces=namespaces) or [fallback])[0])
34
35
36def get_xpath_match_strings(
37    node: Element,
38    path: str,
39    namespaces: Optional[Dict[str, str]] = None,
40) -> list[str]:
41    return [str(x) for x in node.xpath(path, namespaces=namespaces)]
DEFAULT_NAMESPACES = {'uk': 'https://caselaw.nationalarchives.gov.uk/akn', 'akn': 'http://docs.oasis-open.org/legaldocml/ns/akn/3.0'}
Element = <class 'lxml.etree._Element'>
def get_xpath_nodes( node: lxml.etree._Element, path: str, namespaces: Optional[Dict[str, str]] = None) -> list[lxml.etree._Element]:
15def get_xpath_nodes(
16    node: Element,
17    path: str,
18    namespaces: Optional[Dict[str, str]] = None,
19) -> list[Element]:
20    result = node.xpath(path, namespaces=namespaces)
21
22    if not isinstance(result, list) or not all(isinstance(x, Element) for x in result):
23        raise TypeError(f"Expected to return list[Element], got {type(result).__name__}")
24
25    return result
def get_xpath_match_string( node: lxml.etree._Element, path: str, namespaces: Optional[Dict[str, str]] = None, fallback: str = '') -> str:
28def get_xpath_match_string(
29    node: Element,
30    path: str,
31    namespaces: Optional[Dict[str, str]] = None,
32    fallback: str = "",
33) -> str:
34    return str((node.xpath(path, namespaces=namespaces) or [fallback])[0])
def get_xpath_match_strings( node: lxml.etree._Element, path: str, namespaces: Optional[Dict[str, str]] = None) -> list[str]:
37def get_xpath_match_strings(
38    node: Element,
39    path: str,
40    namespaces: Optional[Dict[str, str]] = None,
41) -> list[str]:
42    return [str(x) for x in node.xpath(path, namespaces=namespaces)]