diff src/luan/modules/parsers/Xml2.java @ 1791:f8f5c51f5b36

xml work
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 26 Dec 2023 19:16:18 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/parsers/Xml2.java	Tue Dec 26 19:16:18 2023 -0700
@@ -0,0 +1,86 @@
+package luan.modules.parsers;
+
+import java.util.Map;
+import java.util.LinkedHashMap;
+import goodjava.parser.ParseException;
+import goodjava.xml.XmlParser;
+import goodjava.xml.Xml;
+import goodjava.xml.XmlElement;
+import luan.LuanTable;
+import luan.LuanException;
+
+
+public final class Xml2 {
+
+	public static LuanTable parse(String s) throws ParseException, LuanException {
+		Xml xml = XmlParser.parse(s);
+		LuanTable tbl = new LuanTable();
+		tbl.rawPut( "declaration", xml.declaration );
+		tbl.rawPut( "element", newElement(xml.getElement()) );
+		return tbl;
+	}
+
+	private static LuanTable newElement(XmlElement element) throws LuanException {
+		LuanTable tbl = new LuanTable();
+		tbl.rawPut( "name", element.name );
+		LuanTable attrs = new LuanTable();
+		for( Map.Entry<String,String> entry : element.attributes.entrySet() ) {
+			attrs.rawPut(entry.getKey(),entry.getValue());
+		}
+		tbl.rawPut( "attributes", attrs );
+		Object content = element.getContent();
+		if( content == null ) {
+			// nothing
+		} else if( content instanceof String ) {
+			tbl.rawPut( "content", content );
+		} else {
+			XmlElement[] elements = (XmlElement[])content;
+			LuanTable t = new LuanTable();
+			for( XmlElement el : elements ) {
+				LuanTable elTbl = newElement(el);
+				elTbl.rawPut( "parent", tbl );
+				t.rawAdd(elTbl);
+			}
+			tbl.rawPut( "content", t );
+		}
+		return tbl;
+	}
+
+
+	public static String toString(LuanTable tbl) {
+		Xml xml = new Xml();
+		xml.declaration = (String)tbl.rawGet("declaration");
+		xml.setElement( element( (LuanTable)tbl.rawGet("element") ) );
+		return xml.toString();
+	}
+
+	private static XmlElement element(LuanTable tbl) {
+		String name = (String)tbl.rawGet("name");
+		Map<String,String> map = new LinkedHashMap<String,String>();
+		{
+			LuanTable t = (LuanTable)tbl.rawGet("attributes");
+			for( Map.Entry entry : t.rawIterable() ) {
+				String key =(String)entry.getKey();
+				String value =(String)entry.getValue();
+				map.put(key,value);
+			}
+		}
+		XmlElement element = new XmlElement(name,map);
+		Object content = tbl.rawGet("content");
+		if( content == null ) {
+			// nothing
+		} else if( content instanceof String ) {
+			element.setContent((String)content);
+		} else if( content instanceof LuanTable ) {
+			LuanTable t = (LuanTable)content;
+			int n = t.rawLength();
+			XmlElement[] a = new XmlElement[n];
+			for( int i=0; i<n; i++ ) {
+				LuanTable elTbl = (LuanTable)t.rawGet(Integer.valueOf(i+1));
+				a[i] = element(elTbl);
+			}
+			element.setContent(a);
+		}
+		return element;
+	}
+}