コード例 #1
0
ファイル: ByamlNode.cs プロジェクト: zhuowei/yamlconv
        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();
            }
        }
コード例 #2
0
        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();
                }
            }
        }