import { Constructor, Type } from '@rxap/utilities';
import { RxapElement, RxapElementOptions } from './element';
import { ParsedElement, SafeParsedElement } from './elements/parsed-element';
import { XmlElementParserFunction } from './xml-element-parser-function';
export interface ElementParserWithParsers {
    elementParser: Type<ParsedElement>;
    parsers: XmlElementParserFunction<ParsedElement>[];
}
export declare class XmlParserService {
    protected readonly DOMParser: typeof window.DOMParser;
    readonly elementOptions: RxapElementOptions;
    readonly parsers: Map<string, ElementParserWithParsers>;
    protected _rootElement: string;
    protected get rootElement(): string;
    protected _rootParser: Constructor<ParsedElement> | null;
    constructor(DOMParser: typeof window.DOMParser, elementOptions?: RxapElementOptions);
    register(...elementParsers: Array<Constructor<ParsedElement>>): void;
    setRootElement(nameOrElementParser: string | Constructor<ParsedElement>): void;
    parseAttributes(parsedElement: ParsedElement, element: RxapElement): void;
    /**
     *
     *
     * @param element
     * @param elementNameOrConstructor
     * @param args Constructor parameters for the ParsedElement instance
     * @param parent The parent Parsed Element
     */
    parse<D extends ParsedElement<V>, V = any>(element: RxapElement, elementNameOrConstructor: (string | Constructor<D>) | undefined, parent: ParsedElement | null, args?: any[]): D & SafeParsedElement<V>;
    protected determineElementNameAndParser(elementNameOrConstructor: string | Constructor<ParsedElement>): {
        elementName: string;
        parser: ElementParserWithParsers;
    };
    /**
     *
     * @param xml
     * @param args a list of args passed to the element constructor
     */
    parseFromXml<D extends ParsedElement, V = any>(xml: string, ...args: any[]): D & SafeParsedElement<V>;
    private createDOMParser;
    protected determineRootElement(xmlDoc: Document): RxapElement;
}
