public static void ConvertXML(string fetchPath, ref List<String> blobtables,
ref Dictionary<String, List<String>> t3d,
ref Dictionary<String, List<String>> t2d,
ref Dictionary<String, List<String>> t1d,
Dictionary<String, String> imap,
bool isbase)
{
if (fetchPath == null) return;
XDocument xmlDoc = XDocument.Load(fetchPath, LoadOptions.PreserveWhitespace);
List<String> newtables = new List<String>();
String rombase;
Dictionary<String, List<String>> includes = new Dictionary<String, List<String>>();
if (!isbase)
{
rombase = imap[fetchPath];
}
else
{
var xi = xmlDoc.XPathSelectElement("/rom/romid/xmlid");
rombase = xi.Value.ToString();
}
// ROM table fetches here!
var tableQuery = from t in xmlDoc.XPathSelectElements("/rom/table")
//where table.Ancestors("table").First().IsEmpty
select t;
foreach (XElement table in tableQuery)
{
//skip tables with no name
if (table.Attribute("name") == null) continue;
foreach (String bt in blobtables)
{
if ((table.Attribute("scaling") != null && table.Attribute("scaling").Value == bt) || (table.Attribute("name") != null && table.Attribute("name").Value == bt))
{
table.Name = "tableblob";
if (isbase)
newtables.Add(table.Attribute("name").Value);
if (table.Attribute("type") != null)
table.Attribute("type").Remove();
break;
}
}
if (isbase)
{
blobtables.AddRange(newtables);
newtables.Clear();
}
if (table.Name == "tableblob")
{
continue;
}
bool xaxis = false;
bool yaxis = false;
foreach (XElement xel in table.Descendants())
{
if (xel.Name == "table")
{
if (xel.Attribute("name") != null && xel.Attribute("name").Value == "X")
{
xel.Name = "xaxis";
xel.Attribute("name").Remove();
xaxis = true;
}
else if (xel.Attribute("type") != null && xel.Attribute("type").Value.ContainsCI("static x axis"))
{
xel.Name = "staticxaxis";
xel.Attribute("type").Remove();
xaxis = true;
}
else if (xel.Attribute("type") != null && xel.Attribute("type").Value.ContainsCI("x axis"))
{
xel.Name = "xaxis";
xel.Attribute("type").Remove();
xaxis = true;
}
else if (xel.Attribute("name") != null && xel.Attribute("name").Value == "Y")
{
xel.Name = "yaxis";
xel.Attribute("name").Remove();
yaxis = true;
}
else if (xel.Attribute("type") != null && xel.Attribute("type").Value.ContainsCI("static y axis"))
{
xel.Name = "staticyaxis";
xel.Attribute("type").Remove();
yaxis = true;
}
else if (xel.Attribute("type") != null && xel.Attribute("type").Value.ContainsCI("y axis"))
{
xel.Name = "yaxis";
xel.Attribute("type").Remove();
yaxis = true;
}
}
}
if (!isbase)
{
if (t3d[rombase].Contains(table.Attribute("name").Value.ToString()))
{
table.Name = "table3d";
if (table.Attribute("type") != null) table.Attribute("type").Remove();
continue;
}
if (t2d[rombase].Contains(table.Attribute("name").Value.ToString()))
{
table.Name = "table2d";
if (table.Attribute("type") != null) table.Attribute("type").Remove();
continue;
}
if (t1d[rombase].Contains(table.Attribute("name").Value.ToString()))
{
table.Name = "table1d";
if (table.Attribute("type") != null) table.Attribute("type").Remove();
continue;
}
}
if (xaxis && yaxis) table.Name = "table3d";
else if (xaxis || yaxis) table.Name = "table2d";
else table.Name = "table1d";
if (table.Attribute("type") != null) table.Attribute("type").Remove();
if (isbase)
{
switch (table.Name.ToString())
{
case "table3d":
t3d[rombase].Add(table.Attribute("name").Value);
break;
case "table2d":
t2d[rombase].Add(table.Attribute("name").Value);
break;
case "table1d":
t1d[rombase].Add(table.Attribute("name").Value);
break;
default:
break;
}
}
}
using (XmlTextWriter writer = new XmlTextWriter(fetchPath, new UTF8Encoding(false)))
{
writer.Formatting = Formatting.Indented;
writer.Indentation = 4;
xmlDoc.Save(writer);
}
}