Source code for ogstools.ogs6py.build_tree
# Copyright (c) 2012-2025, OpenGeoSys Community (http://www.opengeosys.org)
#            Distributed under a Modified BSD License.
#            See accompanying file LICENSE.txt or
#            http://www.opengeosys.org/project/license
#
from typing import TypeAlias
from lxml import etree as ET
OptionalETElement: TypeAlias = (
    ET.Element
)  # ToDo this should be Optional[ET.Element]
[docs]
class BuildTree:
    """Helper class to create a nested dictionary
    representing the xml structure.
    """
[docs]
    def __init__(self, tree: ET.ElementTree) -> None:
        self.tree = tree 
    @staticmethod
    def _convertargs(args: dict[str, str]) -> None:
        for item, value in args.items():
            if not isinstance(value, list | dict):
                args[item] = str(value)
[docs]
    @staticmethod
    def populate_tree(
        parent: ET.Element,
        tag: str,
        text: str | None = None,
        attr: dict[str, str] | None = None,
        overwrite: bool = False,
    ) -> ET.Element:
        """
        Method to create dictionary from an xml entity.
        """
        element = None
        if tag is not None:
            if overwrite is True:
                for child in parent:
                    if child.tag == tag:
                        element = child
            if element is None:
                element = ET.SubElement(parent, tag)
            if text is not None:
                element.text = str(text)
            if attr is not None:
                for key, val in attr.items():
                    element.set(key, str(val))
        return element 
[docs]
    @staticmethod
    def get_child_tag(
        parent: ET.Element,
        tag: str,
        attr: dict[str, str] | None = None,
        attr_val: str | None = None,
    ) -> OptionalETElement:
        """
        Search for child tag based on tag and possible attributes-
        """
        element = None
        for child in parent:
            if child.tag == tag:
                if not ((attr is None) and (attr_val is None)):
                    if child.get(attr) == attr_val:
                        element = child
                else:
                    element = child
        return element 
[docs]
    @staticmethod
    def get_child_tag_for_type(
        parent: ET.Element, tag: str, subtagval: str, subtag: str = "type"
    ) -> OptionalETElement:
        """
        Search for child tag based on subtag type.
        """
        element = None
        for child in parent:
            if child.tag == tag:
                for subchild in child:
                    if (subchild.tag == subtag) and (
                        subchild.text == subtagval
                    ):
                        element = child
        return element