comparison 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
comparison
equal deleted inserted replaced
1465:5e3870618377 1466:670b7d089699
1 package luan.modules.parsers;
2
3 import java.util.Collections;
4 import java.util.Map;
5 import java.util.LinkedHashMap;
6 import java.util.List;
7 import java.util.ArrayList;
8 import goodjava.parser.ParseException;
9 import goodjava.xml.XmlElement;
10 import goodjava.xml.XmlParser;
11 import luan.Luan;
12 import luan.LuanTable;
13 import luan.LuanException;
14
15
16 public final class Xml {
17
18 public static String toString(LuanTable tbl) throws LuanException {
19 if( tbl.rawSize() != 1 )
20 throw new LuanException("XML most have 1 root element");
21 Map.Entry entry = tbl.iterator().next();
22 Object key = entry.getKey();
23 if( !(key instanceof String) )
24 throw new LuanException("XML key must be string");
25 String name = (String)key;
26 Object value = entry.getValue();
27 if( !(value instanceof LuanTable) )
28 throw new LuanException("XML root value must be table");
29 LuanTable t = (LuanTable)value;
30 Map<String,String> attributes = attributes(t);
31 XmlElement[] elements = elements(t);
32 XmlElement element = new XmlElement(name,attributes,elements);
33 return element.toString();
34 }
35
36 private static final Integer ONE = new Integer(1);
37
38 private static Map<String,String> attributes(LuanTable tbl) throws LuanException {
39 Object obj = tbl.get(ONE);
40 if( obj==null )
41 return Collections.emptyMap();
42 LuanTable t = (LuanTable)obj;
43 Map<String,String> map = new LinkedHashMap<String,String>();
44 for( Map.Entry entry : t.iterable() ) {
45 String name =(String)entry.getKey();
46 String value =(String)entry.getValue();
47 map.put(name,value);
48 }
49 return map;
50 }
51
52 private static XmlElement[] elements(LuanTable tbl) throws LuanException {
53 List<XmlElement> list = new ArrayList<XmlElement>();
54 for( Map.Entry entry : tbl.iterable() ) {
55 Object key = entry.getKey();
56 if( key.equals(ONE) )
57 continue;
58 String name = (String)key;
59 Object value = entry.getValue();
60 XmlElement element;
61 if( value instanceof String ) {
62 String s = (String)value;
63 element = new XmlElement(name,Collections.emptyMap(),s);
64 } else {
65 LuanTable t = (LuanTable)value;
66 Map<String,String> attributes = attributes(t);
67 XmlElement[] elements = elements(t);
68 element = new XmlElement(name,attributes,elements);
69 }
70 list.add(element);
71 }
72 return list.toArray(new XmlElement[0]);
73 }
74
75
76 public static LuanTable parse(Luan luan,String s) throws ParseException, LuanException {
77 XmlElement element = XmlParser.parse(s);
78 return toTable(luan,new XmlElement[]{element});
79 }
80
81 private static LuanTable toTable(Luan luan,XmlElement[] elements) throws LuanException {
82 LuanTable tbl = new LuanTable(luan);
83 for( XmlElement element : elements ) {
84 if( element.content instanceof String ) {
85 tbl.put(element.name,element.content);
86 } else {
87 XmlElement[] els = (XmlElement[])element.content;
88 LuanTable t = toTable(luan,els);
89 tbl.put(element.name,t);
90 }
91 }
92 return tbl;
93 }
94
95 }