Advertisement
Guest User

XMLTools.hx

a guest
Oct 18th, 2015
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haxe 5.30 KB | None | 0 0
  1. package com.problemmachine.tools.xml;
  2. import flash.errors.Error;
  3.  
  4. class XMLTools
  5. {
  6.     static public inline function getVal(xml:Xml, nodeName:String):String
  7.     {
  8.         if (xml.elementsNamed(nodeName).next().firstChild() != null)
  9.             return xml.elementsNamed(nodeName).next().firstChild().nodeValue;
  10.         else
  11.             return "";
  12.     }
  13.    
  14.     static public function tidyXML(xml:Xml, indentChar:String = "\t", indentCount:UInt = 0):String
  15.     {
  16.         var s:String = "";
  17.         var myIndent:String = "";
  18.         for (i in 0...indentCount)
  19.             myIndent += indentChar;
  20.         switch (xml.nodeType)
  21.         {
  22.             case Xml.Document:
  23.                 for (x in xml)
  24.                     s += tidyXML(x, indentChar, indentCount);
  25.                        
  26.             case Xml.Element:
  27.                 s += myIndent + "<" + xml.nodeName;
  28.                 for (a in xml.attributes())
  29.                     s += " " + a + "=\"" + xml.get(a) + "\"";
  30.                 s += ">";
  31.                 if (xml.firstElement() != null)
  32.                     s += "\n";
  33.                
  34.                 for (x in xml)
  35.                     s += tidyXML(x, indentChar, indentCount + 1);
  36.                
  37.                 if (xml.firstElement() != null)
  38.                     s += myIndent;
  39.                 s += "</" + xml.nodeName + ">\n";
  40.                    
  41.             default:
  42.                 for (i in 0...xml.nodeValue.length)
  43.                 {
  44.                     var char:String = xml.nodeValue.charAt(i);
  45.                     if (char != "\t" && char != "\n" && char != "\r")
  46.                         s += xml.nodeValue.charAt(i);
  47.                 }
  48.         }
  49.         return s;
  50.     }
  51.    
  52.     public static function dataToXML(data:Dynamic):Xml
  53.     {
  54.         if (Std.is(data, String))
  55.         {
  56.             return Xml.parse(
  57.                 "<data>\n" +
  58.                 "   <type>String</type>\n"  +
  59.                 "   <contents>" + data + "</contents>\n"    +
  60.                 "</data>").firstElement();
  61.         }
  62.         else if (Std.is(data, UInt))
  63.         {
  64.             return Xml.parse(
  65.                 "<data>\n" +
  66.                 "   <type>UInt</type>\n"    +
  67.                 "   <contents>" + Std.string(data) + "</contents>\n"    +
  68.                 "</data>").firstElement();
  69.         }
  70.         else if (Std.is(data, Int))
  71.         {
  72.             return Xml.parse(
  73.                 "<data>\n" +
  74.                 "   <type>Int</type>\n" +
  75.                 "   <contents>" + Std.string(data) + "</contents>\n"    +
  76.                 "</data>").firstElement();
  77.         }
  78.         else if (Std.is(data, Float))
  79.         {
  80.             return Xml.parse(
  81.                 "<data>\n" +
  82.                 "   <type>Float</type>\n"   +
  83.                 "   <contents>" + Std.string(data) + "</contents>\n"    +
  84.                 "</data>").firstElement();
  85.         }
  86.         else if (Std.is(data, Bool))
  87.         {
  88.             return Xml.parse(
  89.                 "<data>\n" +
  90.                 "   <type>Bool</type>\n"    +
  91.                 "   <contents>" + Std.string(data) + "</contents>\n"    +
  92.                 "</data>").firstElement();
  93.         }
  94.         else if (Reflect.isEnumValue(data))
  95.         {
  96.             var xml:Xml = Xml.parse(
  97.                 "<data>\n" +
  98.                 "   <type>Enum</type>\n" +
  99.                 "</data>").firstElement();
  100.             var contents:Xml = Xml.parse(
  101.                 "<contents>\n" +
  102.                 "   <name>" + Type.getEnum(cast data).getName() + "</name>\n" +
  103.                 "   <value>" + Std.string(data) + "</value>\n" +
  104.                 "</contents>").firstElement();
  105.             var params:Array<Dynamic> = Type.enumParameters(cast data);
  106.             if (params.length > 0)
  107.             {
  108.                 var x:Xml = Xml.parse("<parameters/>").firstElement();
  109.                 for (d in params)
  110.                     x.addChild(dataToXML(d));
  111.                 contents.addChild(x);
  112.             }
  113.             xml.addChild(contents);
  114.             return xml;
  115.         }
  116.         else if (Std.is(data, Array))
  117.         {
  118.             var xml:Xml = Xml.parse(
  119.                 "<data>\n" +
  120.                 "   <type>Array</type>\n"   +
  121.                 "</data>").firstElement();
  122.             var x:Xml = Xml.parse("<contents/>").firstElement();
  123.             for (d in cast(data, Array<Dynamic>))
  124.                 x.addChild(dataToXML(d));
  125.             xml.addChild(x);
  126.             return xml;
  127.         }
  128.         else
  129.         {
  130.             if (Reflect.hasField(data, "toXML"))
  131.             {
  132.                 var xml:Xml =  Xml.parse(
  133.                     "<data>\n" +
  134.                     "   <type>" + Type.getClassName(Type.getClass(data)) + "</type>\n"  +
  135.                     "</data>").firstElement();
  136.                 var x:Xml = Xml.parse("<contents/>").firstElement();
  137.                 x.addChild(cast data.toXML());
  138.                 xml.addChild(x);
  139.                 return xml;
  140.             }
  141.             else
  142.                 throw new Error("XMLTools.dataToXML(): Type " +
  143.                     Type.getClassName(Type.getClass(data)) + " unrecognized and does not support toXML() functionality");
  144.         }
  145.     }
  146.    
  147.     public static function XMLToData(xml:Xml):Dynamic
  148.     {
  149.         var type:String = XMLTools.getVal(xml, "type");
  150.         var contents:Xml = xml.elementsNamed("contents").next();
  151.         switch(type)
  152.         {
  153.             case "String":
  154.                 return contents.firstChild().nodeValue;
  155.             case "Int":
  156.                 return Std.parseInt(contents.firstChild().nodeValue);
  157.             case "UInt":
  158.                 return cast(Std.parseInt(contents.firstChild().nodeValue), UInt);
  159.             case "Float":
  160.                 return  Std.parseFloat(contents.firstChild().nodeValue);
  161.             case "Bool":
  162.                 return  (contents.firstChild().nodeValue == Std.string(true));
  163.             case "Enum":
  164.                 var params:Array<Dynamic> = [];
  165.                 if (contents.elementsNamed("parameters").hasNext())
  166.                     for (x in contents.elementsNamed("parameters").next().elementsNamed("data"))
  167.                         params.push(XMLToData(x));
  168.                 return Type.createEnum(
  169.                     Type.resolveEnum(XMLTools.getVal(contents, "name")),
  170.                     XMLTools.getVal(contents, "value"),
  171.                     params);
  172.             case "Array":              
  173.                 var arr:Array<Dynamic> = [];
  174.                
  175.                 for (x in contents.elementsNamed("data"))
  176.                     arr.push(XMLToData(x));
  177.                
  178.                 return arr;
  179.             default:
  180.                 var cls = Type.resolveClass(type);
  181.                 if (cls == null)
  182.                     throw new Error ("EntityTemplate.XMLToData(): UNKNOWN TYPE" + type);
  183.                 if (Reflect.hasField(cls, "createFromXML"))
  184.                     return Reflect.callMethod(cls, Reflect.field(cls, "createFromXML"), [contents.firstElement()]);
  185.                 else
  186.                     throw new Error ("EntityTemplate.XMLToData(): Dynamic type " + type + " does not support createFromXML()");
  187.         }
  188.     }
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement