Mercurial Hosting > luan
view 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 source
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; } }