Mercurial Hosting > luan
diff src/luan/modules/parsers/Xml.java @ 1466:670b7d089699
xml support
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 13 Apr 2020 22:00:40 -0600 |
parents | |
children | 35f3bfd4f51d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/modules/parsers/Xml.java Mon Apr 13 22:00:40 2020 -0600 @@ -0,0 +1,95 @@ +package luan.modules.parsers; + +import java.util.Collections; +import java.util.Map; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.ArrayList; +import goodjava.parser.ParseException; +import goodjava.xml.XmlElement; +import goodjava.xml.XmlParser; +import luan.Luan; +import luan.LuanTable; +import luan.LuanException; + + +public final class Xml { + + public static String toString(LuanTable tbl) throws LuanException { + if( tbl.rawSize() != 1 ) + throw new LuanException("XML most have 1 root element"); + Map.Entry entry = tbl.iterator().next(); + Object key = entry.getKey(); + if( !(key instanceof String) ) + throw new LuanException("XML key must be string"); + String name = (String)key; + Object value = entry.getValue(); + if( !(value instanceof LuanTable) ) + throw new LuanException("XML root value must be table"); + LuanTable t = (LuanTable)value; + Map<String,String> attributes = attributes(t); + XmlElement[] elements = elements(t); + XmlElement element = new XmlElement(name,attributes,elements); + return element.toString(); + } + + private static final Integer ONE = new Integer(1); + + private static Map<String,String> attributes(LuanTable tbl) throws LuanException { + Object obj = tbl.get(ONE); + if( obj==null ) + return Collections.emptyMap(); + LuanTable t = (LuanTable)obj; + Map<String,String> map = new LinkedHashMap<String,String>(); + for( Map.Entry entry : t.iterable() ) { + String name =(String)entry.getKey(); + String value =(String)entry.getValue(); + map.put(name,value); + } + return map; + } + + private static XmlElement[] elements(LuanTable tbl) throws LuanException { + List<XmlElement> list = new ArrayList<XmlElement>(); + for( Map.Entry entry : tbl.iterable() ) { + Object key = entry.getKey(); + if( key.equals(ONE) ) + continue; + String name = (String)key; + Object value = entry.getValue(); + XmlElement element; + if( value instanceof String ) { + String s = (String)value; + element = new XmlElement(name,Collections.emptyMap(),s); + } else { + LuanTable t = (LuanTable)value; + Map<String,String> attributes = attributes(t); + XmlElement[] elements = elements(t); + element = new XmlElement(name,attributes,elements); + } + list.add(element); + } + return list.toArray(new XmlElement[0]); + } + + + public static LuanTable parse(Luan luan,String s) throws ParseException, LuanException { + XmlElement element = XmlParser.parse(s); + return toTable(luan,new XmlElement[]{element}); + } + + private static LuanTable toTable(Luan luan,XmlElement[] elements) throws LuanException { + LuanTable tbl = new LuanTable(luan); + for( XmlElement element : elements ) { + if( element.content instanceof String ) { + tbl.put(element.name,element.content); + } else { + XmlElement[] els = (XmlElement[])element.content; + LuanTable t = toTable(luan,els); + tbl.put(element.name,t); + } + } + return tbl; + } + +}