Exemple #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="current"></param>
        public override XElement WriteToXml(XElement current)
        {
            current = current ?? new XElement("object");
            current.SetAttributeValue(JsonTypeAttributeName, "object");
            // простые значения записываем атрибуты
            foreach (var p in Properties.Where(_ => _.Name.Type == JsonTokenType.Literal && _.Value is JsonValue))
            {
                current.SetAttributeValue(p.Name.Value, p.Value.Value);
            }
            // простые но строковые имена пишем с контролем разрешенных имен
            foreach (var p in Properties.Where(_ => _.Name.Type == JsonTokenType.String && _.Value is JsonValue))
            {
                if (IsLiteral(p.Name.Value))
                {
                    current.SetAttributeValue(p.Name.Value, p.Value.Value ?? "");
                }
                else
                {
                    current.SetAttributeValue(XmlExtensions.ConvertToXNameCompatibleString(p.Name.Value), p.Value.Value ?? "");
                }
            }
            //массив пишем как вложенный элемент и передаем ему управление
            foreach (var p in Properties.Where(_ => _.Value is JsonArray))
            {
                var arelement = new XElement(p.Name.Value, new XAttribute("__isarray", true));
                current.Add(arelement);
                p.Value.WriteToXml(arelement);
            }
            //а теперь пишем вложенные объекты
            foreach (var p in Properties.Where(_ => _.Value is JsonObject))
            {
                var name = p.Name.Value;
                int idx  = -1;
                if (name.All(_ => char.IsDigit(_)))
                {
                    name = "item";
                    idx  = name.ToInt();
                }
                var arelement = new XElement(name);
                if (-1 != idx)
                {
                    arelement.SetAttributeValue("idx", idx);
                }
                current.Add(arelement);
                p.Value.WriteToXml(arelement);
            }

            return(current);
        }