Mercurial Hosting > luan
comparison src/luan/modules/parsers/Xml2.java @ 1791:f8f5c51f5b36
xml work
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 26 Dec 2023 19:16:18 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1790:a8c685a894b4 | 1791:f8f5c51f5b36 |
---|---|
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 } |