All pastes #499246 Raw Edit

Someone

public text v1 · immutable
·published 2007-05-20 23:37 UTC
rendered paste body
#
# Utility Functions to output XML
#
#

xml_escape () {

    local res="$2"

    res=${res/\&/\&}
    res=${res/\"/\"}
    res=${res/\'/\'}
    res=${res/\</\&lt;}
    res=${res/\>/\&gt;}

    eval "${1}=\"${res}\""
}

# Outputs the xml declaration
#
#   <?xml version='1.0'?>
#
xml_declaration () {
    echo "<?xml version='1.0'?>"
}

# Outputs the given xml element:
#
# xml_element "element" ["attr1" "v1" "attr2 "v2"... ] ["data"]
#
#    <element attr1="v1" attr2="v2">data</element>
# or
#    <element attr1="v1" attr2="v2"/>
#
xml_element () {
    local tag=${1:?"missing element name parameter to '${FUNCNAME}'"}

    local data=""
    local val=""

    local count=1
    for i in "$@" ; do

        if [ ${count} = 1 ]; then
            xml_escape "tag" "${i}"
            printf "<${tag}"
        elif [ $((count % 2)) -eq 0 ]; then
            xml_escape "data" "${i}"
        else
            xml_escape "val" "${i}"
            printf " ${data}=\"${val}\""
            data=""
        fi

    	let ++count
    done

    if [ ! -z "${data}" ]; then
        printf ">${data}</${tag}>\n"
    else
        printf "/>\n"
    fi

    return 0
}

# Starts the given xml element:
#
# start_xml_element "element" ["attr1" "v1" "attr2 "v2"... ]
#
#    <element attr1="v1" attr2="v2">
#
start_xml_element () {
    local tag=${1:?"missing element name parameter to '${FUNCNAME}'"}

    local data=""
    local val=""

    local count=1
    for i in "$@" ; do

        if [ ${count} = 1 ]; then
            xml_escape "tag" "${i}"
            printf "<${tag}"
        elif [ $((count % 2)) -eq 0 ]; then
            xml_escape "data" "${i}"
        else
            xml_escape "val" "${i}"
            printf " ${data}=\"${val}\""
            data=""
        fi

    	let ++count
    done

    if [ ! -z "${data}" ]; then
        echo "ERROR: missing value for attribute ${data}"
        return -1
    fi

    printf ">\n"

    return 0
}

# Closes the given xml element:
#
# close_xml_element "foo"
#
#    <foo/>
#
close_xml_element () {
    local tag=${1:?"missing element name parameter to '${FUNCNAME}'"}
    xml_escape "tag" "${tag}"
    printf "</${tag}>\n"
}

# ex:ts=4:et: