1466
|
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 }
|