From 7b1ac37678ad62282277bd704356d93c45353d20 Mon Sep 17 00:00:00 2001 From: mfranz Date: Fri, 29 Jun 2007 15:49:08 +0000 Subject: [PATCH] add readxml function that reads an XML file and returns it as property tree --- Nasal/io.nas | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Nasal/io.nas b/Nasal/io.nas index 32607c161..51a471636 100644 --- a/Nasal/io.nas +++ b/Nasal/io.nas @@ -26,3 +26,33 @@ var ifmts = {dir:4, reg:8, lnk:10, sock:12, fifo:1, blk:6, chr:2}; foreach(fmt; keys(ifmts)) caller(0)[0]["is" ~ fmt] = _gen_ifmt_test(ifmts[fmt]); +# Reads an XML file from an absolute path and returns it as property +# tree. All nodes are of type STRING, attributes are written as regular +# nodes with the optional prefix prepended to the name. If the prefix +# is nil, then attributes are ignored. Returns nil on error. +var readxml = func(file, prefix = "") { + var stack = [[0, ""]]; + var node = props.Node.new(); + var tree = node; # prevent GC + var start = func(name, attr) { + stack[-1][0] += 1; # count children + append(stack, [0, ""]); + var index = size(node.getChildren(name)); + node = node.getChild(name, index, 1); + if(prefix != nil) + foreach(var n; keys(attr)) + node.getNode(prefix ~ n, 1).setValue(attr[n]); + } + var end = func(name) { + var buf = pop(stack); + if(!buf[0] and size(buf[1])) + node.setValue(buf[1]); + node = node.getParent(); + } + var data = func(d) { + stack[-1][1] ~= d; + } + return parsexml(file, start, end, data) == nil ? nil : tree; +} + +