--- /dev/null
+# API:
+# XmlPath : string
+# XmlAttr : dict : [XmlPath, string] -> string
+# XmlPayload : string
+
+/^[\(\)]/ {
+ update_node()
+ next
+}
+
+/^A/ && $2 == "CDATA" {
+ update_node_attributes()
+ next
+}
+
+/^-/ {
+ XmlPayload = substr($0, 2, length($0))
+}
+
+function path_to_string(path, depth, p, i) {
+ p = ""
+ for (i = 1; i <= depth; i++) {
+ p = p "/" path[i]
+ }
+ return p
+}
+
+function update_node( paren, name, key, val, path, attr) {
+ paren = substr($1, 1, 1)
+ name = substr($1, 2, length($1) - 1)
+ if (paren == "(") {
+ _depth++
+ _path[_depth] = name
+ XmlPath = path_to_string(_path, _depth)
+ for (key in _hxpipe_curr_attrs) {
+ val = _hxpipe_curr_attrs[key]
+ XmlAttr[XmlPath, key] = val
+ }
+ } else if (paren == ")") {
+ delete _hxpipe_curr_attrs
+ XmlPayload = ""
+ for (key in XmlAttr) {
+ split(key, k, SUBSEP)
+ path = k[1]
+ attr = k[2]
+ if (path == XmlPath) delete XmlAttr[key]
+ }
+ _depth--
+ XmlPath = path_to_string(_path, _depth)
+ } else {
+ printf("ERROR in input line %d - not a parenthesis: \"%s\"\n", NR, paren) > "/dev/stderr"
+ exit 1
+ }
+}
+
+function update_node_attributes( key, val, s) {
+ key = substr($1, 2, length($1))
+ val = $0
+ s = " +"
+ sub("^" $1 s $2 s, "", val)
+ _hxpipe_curr_attrs[key] = val
+}