using xml::XElem

** An abstraction around various Elem implementations.
mixin SElem {
    ** Create a Elem from an XML XElem instance.
    static new fromXml(XElem elem) {
    ** Returns the tag name.
    abstract Str name()
    ** Returns 'null' if attr is not defined.
    abstract Str? attr(Str attrName)
    ** Returns a map of attribute name / value pairs.
    abstract Str:Str attrs()
    ** Returns the tag text.
    abstract Str text()

    ** Returns the parent tag.
    abstract SElem? parent()
    ** Returns child Elems.
    abstract SElem[] children()
    ** Returns the underlying elem object.
    virtual Obj? toNative() { throw UnsupportedErr() }