112 lines
2.4 KiB
C#
112 lines
2.4 KiB
C#
public class MegaXMLReader
|
|
{
|
|
private static char TAG_START = '<';
|
|
|
|
private static char TAG_END = '>';
|
|
|
|
private static char SPACE = ' ';
|
|
|
|
private static char QUOTE = '"';
|
|
|
|
private static char SLASH = '/';
|
|
|
|
private static char EQUALS = '=';
|
|
|
|
private static string BEGIN_QUOTE = string.Empty + EQUALS + QUOTE;
|
|
|
|
public MegaXMLNode read(string xml)
|
|
{
|
|
int num = 0;
|
|
int num2 = 0;
|
|
MegaXMLNode megaXMLNode = new MegaXMLNode();
|
|
MegaXMLNode megaXMLNode2 = megaXMLNode;
|
|
xml = xml.Replace(" \n", string.Empty);
|
|
xml = xml.Replace("\n", string.Empty);
|
|
while (true)
|
|
{
|
|
num = xml.IndexOf(TAG_START, num2);
|
|
if (num < 0 || num >= xml.Length)
|
|
{
|
|
break;
|
|
}
|
|
num++;
|
|
num2 = xml.IndexOf(TAG_END, num);
|
|
if (num2 < 0 || num2 >= xml.Length)
|
|
{
|
|
break;
|
|
}
|
|
int num3 = num2 - num;
|
|
string text = xml.Substring(num, num3);
|
|
if (text[0] == SLASH)
|
|
{
|
|
megaXMLNode2 = megaXMLNode2.parentNode;
|
|
continue;
|
|
}
|
|
bool flag = true;
|
|
if (text[num3 - 1] == SLASH)
|
|
{
|
|
text = text.Substring(0, num3 - 1);
|
|
flag = false;
|
|
}
|
|
MegaXMLNode megaXMLNode3 = parseTag(text);
|
|
megaXMLNode3.parentNode = megaXMLNode2;
|
|
megaXMLNode2.children.Add(megaXMLNode3);
|
|
if (flag)
|
|
{
|
|
megaXMLNode2 = megaXMLNode3;
|
|
}
|
|
}
|
|
return megaXMLNode;
|
|
}
|
|
|
|
public MegaXMLNode parseTag(string xmlTag)
|
|
{
|
|
MegaXMLNode megaXMLNode = new MegaXMLNode();
|
|
int num = xmlTag.IndexOf(SPACE, 0);
|
|
if (num < 0)
|
|
{
|
|
megaXMLNode.tagName = xmlTag;
|
|
return megaXMLNode;
|
|
}
|
|
string tagName = xmlTag.Substring(0, num);
|
|
megaXMLNode.tagName = tagName;
|
|
string xmlTag2 = xmlTag.Substring(num, xmlTag.Length - num);
|
|
return parseAttributes(xmlTag2, megaXMLNode);
|
|
}
|
|
|
|
public MegaXMLNode parseAttributes(string xmlTag, MegaXMLNode node)
|
|
{
|
|
int num = 0;
|
|
int num2 = 0;
|
|
int num3 = 0;
|
|
while (true)
|
|
{
|
|
num = xmlTag.IndexOf(BEGIN_QUOTE, num3);
|
|
if (num < 0 || num > xmlTag.Length)
|
|
{
|
|
break;
|
|
}
|
|
num2 = xmlTag.LastIndexOf(SPACE, num);
|
|
if (num2 < 0 || num2 > xmlTag.Length)
|
|
{
|
|
break;
|
|
}
|
|
num2++;
|
|
string name = xmlTag.Substring(num2, num - num2);
|
|
num += 2;
|
|
num3 = xmlTag.IndexOf(QUOTE, num);
|
|
if (num3 < 0 || num3 > xmlTag.Length)
|
|
{
|
|
break;
|
|
}
|
|
int length = num3 - num;
|
|
string value = xmlTag.Substring(num, length);
|
|
MegaXMLValue megaXMLValue = new MegaXMLValue();
|
|
megaXMLValue.name = name;
|
|
megaXMLValue.value = value;
|
|
node.values.Add(megaXMLValue);
|
|
}
|
|
return node;
|
|
}
|
|
}
|