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