public static ByamlNode FromXml(XmlDocument doc, XmlNode xmlNode, List<string> nodes, List<string> values, List<string> data) { XmlNode child = xmlNode.FirstChild; while (child != null && child.NodeType == XmlNodeType.Comment) child = child.NextSibling; if (child == null || child.NodeType == XmlNodeType.Element) { if (xmlNode.Attributes["type"] != null && xmlNode.Attributes["type"].Value == "array") { UnamedNode node = new UnamedNode(); foreach (XmlNode item in xmlNode.ChildNodes) if (item.NodeType == XmlNodeType.Element) node.Nodes.Add(FromXml(doc, item, nodes, values, data)); return node; } else if (xmlNode.Attributes["type"] != null && xmlNode.Attributes["type"].Value == "path") { string value; using (MemoryStream ms = new MemoryStream()) { using (EndianBinaryWriter wr = new EndianBinaryWriter(ms)) { foreach (XmlNode item in xmlNode.ChildNodes) { if (item.NodeType == XmlNodeType.Element && string.Equals(item.Name, "point", StringComparison.OrdinalIgnoreCase)) { wr.Write(float.Parse(item.Attributes["x"].Value.Remove(item.Attributes["x"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["y"].Value.Remove(item.Attributes["y"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["z"].Value.Remove(item.Attributes["z"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["nx"].Value.Remove(item.Attributes["nx"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["ny"].Value.Remove(item.Attributes["ny"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["nz"].Value.Remove(item.Attributes["nz"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(int.Parse(item.Attributes["val"].Value, CultureInfo.InvariantCulture)); } } } value = Convert.ToBase64String(ms.ToArray()); } if (!data.Contains(value)) data.Add(value); return new Data(data.IndexOf(value)); } else { NamedNode node = new NamedNode(); foreach (XmlNode item in xmlNode.ChildNodes) { if (item.NodeType == XmlNodeType.Element) { if (!nodes.Contains(item.Name)) nodes.Add(item.Name); node.Nodes.Add(new KeyValuePair<int, ByamlNode>(nodes.IndexOf(item.Name), FromXml(doc, item, nodes, values, data))); } } foreach (XmlAttribute item in xmlNode.Attributes) { if (!nodes.Contains(item.Name)) nodes.Add(item.Name); node.Nodes.Add(new KeyValuePair<int, ByamlNode>(nodes.IndexOf(item.Name), FromXml(doc, item, nodes, values, data))); } return node; } } else { if (xmlNode.Attributes != null && xmlNode.Attributes["type"] != null) { if (xmlNode.Attributes["type"].Value == "string") { if (!values.Contains(xmlNode.InnerText)) values.Add(xmlNode.InnerText); return new String(values.IndexOf(xmlNode.InnerText)); } } int value_int; bool value_bool; if (xmlNode.InnerText.EndsWith("f", StringComparison.OrdinalIgnoreCase)) return new Single(float.Parse(xmlNode.InnerText.Remove(xmlNode.InnerText.Length - 1), CultureInfo.InvariantCulture)); else if (int.TryParse(xmlNode.InnerText, out value_int)) return new Int(value_int); else if (bool.TryParse(xmlNode.InnerText, out value_bool)) return new Boolean(value_bool); else throw new InvalidDataException(); } }
public static ByamlNode FromXml(XmlDocument doc, XmlNode xmlNode, List <string> nodes, List <string> values, List <string> data) { XmlNode child = xmlNode.FirstChild; while (child != null && child.NodeType == XmlNodeType.Comment) { child = child.NextSibling; } if (child == null || child.NodeType == XmlNodeType.Element) { if (xmlNode.Attributes["type"] != null && xmlNode.Attributes["type"].Value == "array") { UnamedNode node = new UnamedNode(); foreach (XmlNode item in xmlNode.ChildNodes) { if (item.NodeType == XmlNodeType.Element) { node.Nodes.Add(FromXml(doc, item, nodes, values, data)); } } return(node); } else if (xmlNode.Attributes["type"] != null && xmlNode.Attributes["type"].Value == "path") { string value; using (MemoryStream ms = new MemoryStream()) { using (EndianBinaryWriter wr = new EndianBinaryWriter(ms)) { foreach (XmlNode item in xmlNode.ChildNodes) { if (item.NodeType == XmlNodeType.Element && string.Equals(item.Name, "point", StringComparison.OrdinalIgnoreCase)) { wr.Write(float.Parse(item.Attributes["x"].Value.Remove(item.Attributes["x"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["y"].Value.Remove(item.Attributes["y"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["z"].Value.Remove(item.Attributes["z"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["nx"].Value.Remove(item.Attributes["nx"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["ny"].Value.Remove(item.Attributes["ny"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(float.Parse(item.Attributes["nz"].Value.Remove(item.Attributes["nz"].Value.Length - 1), CultureInfo.InvariantCulture)); wr.Write(int.Parse(item.Attributes["val"].Value, CultureInfo.InvariantCulture)); } } } value = Convert.ToBase64String(ms.ToArray()); } if (!data.Contains(value)) { data.Add(value); } return(new Data(data.IndexOf(value))); } else if (xmlNode.Attributes["type"] != null && xmlNode.Attributes["type"].Value == "null") { return(new Null()); } else { NamedNode node = new NamedNode(); foreach (XmlNode item in xmlNode.ChildNodes) { if (item.NodeType == XmlNodeType.Element) { if (!nodes.Contains(item.Name)) { nodes.Add(item.Name); } node.Nodes.Add(new KeyValuePair <int, ByamlNode>(nodes.IndexOf(item.Name), FromXml(doc, item, nodes, values, data))); } } foreach (XmlAttribute item in xmlNode.Attributes) { if (item.Prefix != "xmlns" && item.NamespaceURI != "yamlconv") { if (!nodes.Contains(item.Name)) { nodes.Add(item.Name); } node.Nodes.Add(new KeyValuePair <int, ByamlNode>(nodes.IndexOf(item.Name), FromXml(doc, item, nodes, values, data))); } } return(node); } } else { if (xmlNode.Attributes != null && xmlNode.Attributes["type"] != null) { if (xmlNode.Attributes["type"].Value == "string") { if (!values.Contains(xmlNode.InnerText)) { values.Add(xmlNode.InnerText); } return(new String(values.IndexOf(xmlNode.InnerText))); } } int value_int; bool value_bool; if (xmlNode.InnerText.EndsWith("f", StringComparison.OrdinalIgnoreCase)) { return(new Single(float.Parse(xmlNode.InnerText.Remove(xmlNode.InnerText.Length - 1), CultureInfo.InvariantCulture))); } else if (int.TryParse(xmlNode.InnerText, out value_int)) { return(new Int(value_int)); } else if (bool.TryParse(xmlNode.InnerText, out value_bool)) { return(new Boolean(value_bool)); } else { throw new InvalidDataException(); } } }