package com.robert.maps.applib.kml.XMLparser; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Vector; import java.util.Map.Entry; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xmlpull.v1.XmlSerializer; import android.util.Xml; import com.robert.maps.applib.utils.Ut; public class SimpleXML { private SimpleXML fparent; private String ftext; private String fname; private Vector<SimpleXML> fchild; private HashMap<String, String> fattrs; public String getText() { return ftext; } public void setText(String newText) { ftext = newText; } public String getAttr(String attrName) { if (fattrs.containsKey(attrName)) return fattrs.get(attrName); return ""; } public void setAttr(String attrName, String attrValue) { fattrs.put(attrName, attrValue); } public int getAttrCount() { return fattrs.size(); } public int getChildCount() { return fchild.size(); } public Vector<SimpleXML> getChildren() { return fchild; } public SimpleXML getParent() { return fparent; } public void setParent(SimpleXML newParent) { if (fparent != null) { try { fparent.fchild.remove(this); } catch (Exception e) { } } if (newParent instanceof SimpleXML) { fparent = newParent; try { fparent.fchild.add(this); } catch (Exception e) { } } else { fparent = null; } } public SimpleXML(String nodeName) { fname = nodeName; ftext = ""; fattrs = new HashMap<String, String>(); fchild = new Vector<SimpleXML>(); fparent = null; } public static SimpleXML fromNode(Node node) { SimpleXML ret = null; if (node != null) { try { ret = new SimpleXML(node.getNodeName()); if (node.hasAttributes()) { NamedNodeMap nattr = node.getAttributes(); for(int f = 0; f < nattr.getLength(); ++f) { ret.setAttr(nattr.item(f).getNodeName(), nattr.item(f).getNodeValue()); } } if (node.hasChildNodes()) { NodeList nlc = node.getChildNodes(); for(int f = 0; f < nlc.getLength(); ++f) { if (nlc.item(f).getNodeType() == Node.TEXT_NODE) { ret.ftext += nlc.item(f).getNodeValue(); } else if (nlc.item(f).getNodeType() == Node.ENTITY_REFERENCE_NODE) { String nv = nlc.item(f).getNodeName(); if (nv != null && nv.length() > 1 && nv.startsWith("#")) { nv = nv.substring(1); try { int[] z = { Integer.parseInt(nv) }; String s = new String(z, 0, z.length); ret.ftext += s; } catch (Exception e) { } } } else { SimpleXML rchild = SimpleXML.fromNode(nlc.item(f)); if (rchild != null) ret.getChildren().add(rchild); } } } } catch (Exception e) { } } return ret; } public SimpleXML createChild(String nodeName) { SimpleXML child = new SimpleXML(nodeName); child.setParent(this); return child; } public Vector<SimpleXML> getChildren(String nodeName) { Vector<SimpleXML> ret = new Vector<SimpleXML>(); try { Iterator<SimpleXML> i = fchild.iterator(); while(i.hasNext()) { SimpleXML xml = i.next(); if (xml.fname.equalsIgnoreCase(nodeName)) { ret.add(xml); } } } catch (Exception e) { } return ret; } public SimpleXML getNodeByPath(String nodePath, boolean createIfNotExists) { if (nodePath == null || nodePath.trim().equalsIgnoreCase("")) return null; SimpleXML ret = null; try { String[] bpath = nodePath.split("\\\\"); if (bpath != null && bpath.length > 0) { int scnt = 0; for(int f = 0; f < bpath.length; ++f) { String c = bpath[f].trim(); if (c != null && c.length() > 0) scnt++; } if (scnt > 0) { ret = this; for(int f = 0; f < bpath.length; ++f) { String c = bpath[f].trim(); if (c != null && c.length() > 0) { Vector<SimpleXML> curnodes = ret.getChildren(c); if (curnodes != null && curnodes.size() > 0) { ret = curnodes.firstElement(); } else { if (createIfNotExists) { ret = ret.createChild(c); } else { ret = null; break; } } } } } } } catch (Exception e) { } return ret; } public static SimpleXML loadXml(String txxml) { SimpleXML ret = null; try { ret = SimpleXML.loadXml(new ByteArrayInputStream(txxml.getBytes())); } catch (Exception e) { } return ret; } public static SimpleXML loadXml(InputStream isxml) { SimpleXML ret = null; try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder(); Document doc = dbBuilder.parse(isxml); ret = SimpleXML.fromNode(doc.getDocumentElement()); } catch (Exception e) { } return ret; } void serializeNode(XmlSerializer ser) { try { ser.startTag("", fname); for(Entry<String, String> ee : fattrs.entrySet()) { ser.attribute("", ee.getKey(), ee.getValue()); } if (fchild.size() > 0) { for (SimpleXML c : fchild) { c.serializeNode(ser); } } else { if (ftext != null) ser.text(ftext); } ser.endTag("", fname); } catch(Exception e) { Ut.d("e: " + e.toString()); } } public static String saveXml(SimpleXML document) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); XmlSerializer xs = Xml.newSerializer(); xs.setOutput(baos, "Utf-8"); xs.startDocument("Utf-8", true); document.serializeNode(xs); xs.endDocument(); return new String(baos.toByteArray()); } catch(Exception e) { } return ""; } }