1791
|
1 package luan.modules.parsers;
|
|
2
|
|
3 import java.util.Map;
|
|
4 import java.util.LinkedHashMap;
|
|
5 import goodjava.parser.ParseException;
|
|
6 import goodjava.xml.XmlParser;
|
|
7 import goodjava.xml.Xml;
|
|
8 import goodjava.xml.XmlElement;
|
|
9 import luan.LuanTable;
|
|
10 import luan.LuanException;
|
|
11
|
|
12
|
|
13 public final class Xml2 {
|
|
14
|
|
15 public static LuanTable parse(String s) throws ParseException, LuanException {
|
|
16 Xml xml = XmlParser.parse(s);
|
|
17 LuanTable tbl = new LuanTable();
|
|
18 tbl.rawPut( "declaration", xml.declaration );
|
|
19 tbl.rawPut( "element", newElement(xml.getElement()) );
|
|
20 return tbl;
|
|
21 }
|
|
22
|
|
23 private static LuanTable newElement(XmlElement element) throws LuanException {
|
|
24 LuanTable tbl = new LuanTable();
|
|
25 tbl.rawPut( "name", element.name );
|
|
26 LuanTable attrs = new LuanTable();
|
|
27 for( Map.Entry<String,String> entry : element.attributes.entrySet() ) {
|
|
28 attrs.rawPut(entry.getKey(),entry.getValue());
|
|
29 }
|
|
30 tbl.rawPut( "attributes", attrs );
|
|
31 Object content = element.getContent();
|
|
32 if( content == null ) {
|
|
33 // nothing
|
|
34 } else if( content instanceof String ) {
|
|
35 tbl.rawPut( "content", content );
|
|
36 } else {
|
|
37 XmlElement[] elements = (XmlElement[])content;
|
|
38 LuanTable t = new LuanTable();
|
|
39 for( XmlElement el : elements ) {
|
|
40 LuanTable elTbl = newElement(el);
|
|
41 elTbl.rawPut( "parent", tbl );
|
|
42 t.rawAdd(elTbl);
|
|
43 }
|
|
44 tbl.rawPut( "content", t );
|
|
45 }
|
|
46 return tbl;
|
|
47 }
|
|
48
|
|
49
|
|
50 public static String toString(LuanTable tbl) {
|
|
51 Xml xml = new Xml();
|
|
52 xml.declaration = (String)tbl.rawGet("declaration");
|
|
53 xml.setElement( element( (LuanTable)tbl.rawGet("element") ) );
|
|
54 return xml.toString();
|
|
55 }
|
|
56
|
|
57 private static XmlElement element(LuanTable tbl) {
|
|
58 String name = (String)tbl.rawGet("name");
|
|
59 Map<String,String> map = new LinkedHashMap<String,String>();
|
|
60 {
|
|
61 LuanTable t = (LuanTable)tbl.rawGet("attributes");
|
|
62 for( Map.Entry entry : t.rawIterable() ) {
|
|
63 String key =(String)entry.getKey();
|
|
64 String value =(String)entry.getValue();
|
|
65 map.put(key,value);
|
|
66 }
|
|
67 }
|
|
68 XmlElement element = new XmlElement(name,map);
|
|
69 Object content = tbl.rawGet("content");
|
|
70 if( content == null ) {
|
|
71 // nothing
|
|
72 } else if( content instanceof String ) {
|
|
73 element.setContent((String)content);
|
|
74 } else if( content instanceof LuanTable ) {
|
|
75 LuanTable t = (LuanTable)content;
|
|
76 int n = t.rawLength();
|
|
77 XmlElement[] a = new XmlElement[n];
|
|
78 for( int i=0; i<n; i++ ) {
|
|
79 LuanTable elTbl = (LuanTable)t.rawGet(Integer.valueOf(i+1));
|
|
80 a[i] = element(elTbl);
|
|
81 }
|
|
82 element.setContent(a);
|
|
83 }
|
|
84 return element;
|
|
85 }
|
|
86 }
|