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;
+	}
+
+}