Esempio n. 1
0
        private void SerializeNode(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName)
        {
            switch (node.NodeType)
            {
            case XmlNodeType.Document:
            case XmlNodeType.DocumentFragment:
                SerializeGroupedNodes(writer, node, manager, writePropertyName);
                break;

            case XmlNodeType.Element:
                if (IsArray(node) && node.ChildNodes.All(n => n.LocalName == node.LocalName) && node.ChildNodes.Count > 0)
                {
                    SerializeGroupedNodes(writer, node, manager, false);
                }
                else
                {
                    manager.PushScope();

                    foreach (IXmlNode attribute in node.Attributes)
                    {
                        if (attribute.NamespaceUri == "http://www.w3.org/2000/xmlns/")
                        {
                            string namespacePrefix = (attribute.LocalName != "xmlns")
                                    ? attribute.LocalName
                                    : string.Empty;
                            string namespaceUri = attribute.Value;

                            manager.AddNamespace(namespacePrefix, namespaceUri);
                        }
                    }

                    if (writePropertyName)
                    {
                        writer.WritePropertyName(GetPropertyName(node, manager));
                    }

                    if (!ValueAttributes(node.Attributes).Any() && node.ChildNodes.Count == 1 &&
                        node.ChildNodes[0].NodeType == XmlNodeType.Text)
                    {
                        // write elements with a single text child as a name value pair
                        writer.WriteValue(node.ChildNodes[0].Value);
                    }
                    else if (node.ChildNodes.Count == 0 && CollectionUtils.IsNullOrEmpty(node.Attributes))
                    {
                        IXmlElement element = (IXmlElement)node;

                        // empty element
                        if (element.IsEmpty)
                        {
                            writer.WriteNull();
                        }
                        else
                        {
                            writer.WriteValue(string.Empty);
                        }
                    }
                    else
                    {
                        writer.WriteStartObject();

                        for (int i = 0; i < node.Attributes.Count; i++)
                        {
                            SerializeNode(writer, node.Attributes[i], manager, true);
                        }

                        SerializeGroupedNodes(writer, node, manager, true);

                        writer.WriteEndObject();
                    }

                    manager.PopScope();
                }

                break;

            case XmlNodeType.Comment:
                if (writePropertyName)
                {
                    writer.WriteComment(node.Value);
                }
                break;

            case XmlNodeType.Attribute:
            case XmlNodeType.Text:
            case XmlNodeType.CDATA:
            case XmlNodeType.ProcessingInstruction:
            case XmlNodeType.Whitespace:
            case XmlNodeType.SignificantWhitespace:
                if (node.NamespaceUri == "http://www.w3.org/2000/xmlns/" && node.Value == JsonNamespaceUri)
                {
                    return;
                }

                if (node.NamespaceUri == JsonNamespaceUri)
                {
                    if (node.LocalName == "Array")
                    {
                        return;
                    }
                }

                if (writePropertyName)
                {
                    writer.WritePropertyName(GetPropertyName(node, manager));
                }
                writer.WriteValue(node.Value);
                break;

            case XmlNodeType.XmlDeclaration:
                IXmlDeclaration declaration = (IXmlDeclaration)node;
                writer.WritePropertyName(GetPropertyName(node, manager));
                writer.WriteStartObject();

                if (!string.IsNullOrEmpty(declaration.Version))
                {
                    writer.WritePropertyName("@version");
                    writer.WriteValue(declaration.Version);
                }
                if (!string.IsNullOrEmpty(declaration.Encoding))
                {
                    writer.WritePropertyName("@encoding");
                    writer.WriteValue(declaration.Encoding);
                }
                if (!string.IsNullOrEmpty(declaration.Standalone))
                {
                    writer.WritePropertyName("@standalone");
                    writer.WriteValue(declaration.Standalone);
                }

                writer.WriteEndObject();
                break;

            case XmlNodeType.DocumentType:
                IXmlDocumentType documentType = (IXmlDocumentType)node;
                writer.WritePropertyName(GetPropertyName(node, manager));
                writer.WriteStartObject();

                if (!string.IsNullOrEmpty(documentType.Name))
                {
                    writer.WritePropertyName("@name");
                    writer.WriteValue(documentType.Name);
                }
                if (!string.IsNullOrEmpty(documentType.Public))
                {
                    writer.WritePropertyName("@public");
                    writer.WriteValue(documentType.Public);
                }
                if (!string.IsNullOrEmpty(documentType.System))
                {
                    writer.WritePropertyName("@system");
                    writer.WriteValue(documentType.System);
                }
                if (!string.IsNullOrEmpty(documentType.InternalSubset))
                {
                    writer.WritePropertyName("@internalSubset");
                    writer.WriteValue(documentType.InternalSubset);
                }

                writer.WriteEndObject();
                break;

            default:
                throw new JsonSerializationException("Unexpected XmlNodeType when serializing nodes: " + node.NodeType);
            }
        }
Esempio n. 2
0
        private void SerializeNode(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName)
        {
            switch (node.NodeType)
            {
            case XmlNodeType.Document:
            case XmlNodeType.DocumentFragment:
                SerializeGroupedNodes(writer, node, manager, writePropertyName);
                break;

            case XmlNodeType.Element:
            {
                if (IsArray(node) && node.ChildNodes.All((IXmlNode n) => n.LocalName == node.LocalName) && node.ChildNodes.Count > 0)
                {
                    SerializeGroupedNodes(writer, node, manager, writePropertyName: false);
                    break;
                }
                foreach (IXmlNode attribute in node.Attributes)
                {
                    if (attribute.NamespaceURI == "http://www.w3.org/2000/xmlns/")
                    {
                        string prefix = ((attribute.LocalName != "xmlns") ? attribute.LocalName : string.Empty);
                        manager.AddNamespace(prefix, attribute.Value);
                    }
                }
                if (writePropertyName)
                {
                    writer.WritePropertyName(GetPropertyName(node, manager));
                }
                if (ValueAttributes(node.Attributes).Count() == 0 && node.ChildNodes.Count == 1 && node.ChildNodes[0].NodeType == XmlNodeType.Text)
                {
                    writer.WriteValue(node.ChildNodes[0].Value);
                    break;
                }
                if (node.ChildNodes.Count == 0 && CollectionUtils.IsNullOrEmpty(node.Attributes))
                {
                    writer.WriteNull();
                    break;
                }
                writer.WriteStartObject();
                for (int i = 0; i < node.Attributes.Count; i++)
                {
                    SerializeNode(writer, node.Attributes[i], manager, writePropertyName: true);
                }
                SerializeGroupedNodes(writer, node, manager, writePropertyName: true);
                writer.WriteEndObject();
                break;
            }

            case XmlNodeType.Comment:
                if (writePropertyName)
                {
                    writer.WriteComment(node.Value);
                }
                break;

            case XmlNodeType.Attribute:
            case XmlNodeType.Text:
            case XmlNodeType.CDATA:
            case XmlNodeType.ProcessingInstruction:
            case XmlNodeType.Whitespace:
            case XmlNodeType.SignificantWhitespace:
                if ((!(node.NamespaceURI == "http://www.w3.org/2000/xmlns/") || !(node.Value == "http://james.newtonking.com/projects/json")) && (!(node.NamespaceURI == "http://james.newtonking.com/projects/json") || !(node.LocalName == "Array")))
                {
                    if (writePropertyName)
                    {
                        writer.WritePropertyName(GetPropertyName(node, manager));
                    }
                    writer.WriteValue(node.Value);
                }
                break;

            case XmlNodeType.XmlDeclaration:
            {
                IXmlDeclaration xmlDeclaration = (IXmlDeclaration)node;
                writer.WritePropertyName(GetPropertyName(node, manager));
                writer.WriteStartObject();
                if (!string.IsNullOrEmpty(xmlDeclaration.Version))
                {
                    writer.WritePropertyName("@version");
                    writer.WriteValue(xmlDeclaration.Version);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Encoding))
                {
                    writer.WritePropertyName("@encoding");
                    writer.WriteValue(xmlDeclaration.Encoding);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Standalone))
                {
                    writer.WritePropertyName("@standalone");
                    writer.WriteValue(xmlDeclaration.Standalone);
                }
                writer.WriteEndObject();
                break;
            }

            default:
                throw new JsonSerializationException("Unexpected XmlNodeType when serializing nodes: " + node.NodeType);
            }
        }
Esempio n. 3
0
        private void SerializeNode(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName)
        {
            switch (node.NodeType)
            {
            case XmlNodeType.Element:
            {
                if (!this.IsArray(node) || !node.ChildNodes.All <IXmlNode>((IXmlNode n) => n.LocalName == node.LocalName) || node.ChildNodes.Count <= 0)
                {
                    foreach (IXmlNode attribute in node.Attributes)
                    {
                        if (attribute.NamespaceURI != "http://www.w3.org/2000/xmlns/")
                        {
                            continue;
                        }
                        manager.AddNamespace((attribute.LocalName == "xmlns" ? string.Empty : attribute.LocalName), attribute.Value);
                    }
                    if (writePropertyName)
                    {
                        writer.WritePropertyName(this.GetPropertyName(node, manager));
                    }
                    if (this.ValueAttributes(node.Attributes).Count <IXmlNode>() == 0 && node.ChildNodes.Count == 1 && node.ChildNodes[0].NodeType == XmlNodeType.Text)
                    {
                        writer.WriteValue(node.ChildNodes[0].Value);
                    }
                    else if (node.ChildNodes.Count != 0 || !CollectionUtils.IsNullOrEmpty <IXmlNode>(node.Attributes))
                    {
                        writer.WriteStartObject();
                        for (int i = 0; i < node.Attributes.Count; i++)
                        {
                            this.SerializeNode(writer, node.Attributes[i], manager, true);
                        }
                        this.SerializeGroupedNodes(writer, node, manager, true);
                        writer.WriteEndObject();
                    }
                    else
                    {
                        writer.WriteNull();
                    }
                }
                else
                {
                    this.SerializeGroupedNodes(writer, node, manager, false);
                }
                break;
            }

            case XmlNodeType.Attribute:
            case XmlNodeType.Text:
            case XmlNodeType.CDATA:
            case XmlNodeType.ProcessingInstruction:
            case XmlNodeType.Whitespace:
            case XmlNodeType.SignificantWhitespace:
            {
                if (node.NamespaceURI == "http://www.w3.org/2000/xmlns/" && node.Value == "http://james.newtonking.com/projects/json")
                {
                    return;
                }
                if (node.NamespaceURI == "http://james.newtonking.com/projects/json" && node.LocalName == "Array")
                {
                    return;
                }
                if (writePropertyName)
                {
                    writer.WritePropertyName(this.GetPropertyName(node, manager));
                }
                writer.WriteValue(node.Value);
                break;
            }

            case XmlNodeType.EntityReference:
            case XmlNodeType.Entity:
            case XmlNodeType.DocumentType:
            case XmlNodeType.Notation:
            case XmlNodeType.EndElement:
            case XmlNodeType.EndEntity:
            {
                throw new JsonSerializationException(string.Concat("Unexpected XmlNodeType when serializing nodes: ", node.NodeType));
            }

            case XmlNodeType.Comment:
            {
                if (writePropertyName)
                {
                    writer.WriteComment(node.Value);
                }
                break;
            }

            case XmlNodeType.Document:
            case XmlNodeType.DocumentFragment:
            {
                this.SerializeGroupedNodes(writer, node, manager, writePropertyName);
                break;
            }

            case XmlNodeType.XmlDeclaration:
            {
                IXmlDeclaration xmlDeclaration = (IXmlDeclaration)node;
                writer.WritePropertyName(this.GetPropertyName(node, manager));
                writer.WriteStartObject();
                if (!string.IsNullOrEmpty(xmlDeclaration.Version))
                {
                    writer.WritePropertyName("@version");
                    writer.WriteValue(xmlDeclaration.Version);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Encoding))
                {
                    writer.WritePropertyName("@encoding");
                    writer.WriteValue(xmlDeclaration.Encoding);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Standalone))
                {
                    writer.WritePropertyName("@standalone");
                    writer.WriteValue(xmlDeclaration.Standalone);
                }
                writer.WriteEndObject();
                break;
            }

            default:
            {
                throw new JsonSerializationException(string.Concat("Unexpected XmlNodeType when serializing nodes: ", node.NodeType));
            }
            }
        }
        private void SerializeNode(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName)
        {
            switch (node.NodeType)
            {
            case XmlNodeType.Element:
                if (this.IsArray(node))
                {
                    if (node.ChildNodes.All((IXmlNode n) => n.LocalName == node.LocalName) && node.ChildNodes.Count > 0)
                    {
                        this.SerializeGroupedNodes(writer, node, manager, false);
                        return;
                    }
                }
                manager.PushScope();
                foreach (IXmlNode current in node.Attributes)
                {
                    if (current.NamespaceUri == "http://www.w3.org/2000/xmlns/")
                    {
                        string prefix = (current.LocalName != "xmlns") ? current.LocalName : string.Empty;
                        string value  = current.Value;
                        manager.AddNamespace(prefix, value);
                    }
                }
                if (writePropertyName)
                {
                    writer.WritePropertyName(this.GetPropertyName(node, manager));
                }
                if (!this.ValueAttributes(node.Attributes).Any <IXmlNode>() && node.ChildNodes.Count == 1 && node.ChildNodes[0].NodeType == XmlNodeType.Text)
                {
                    writer.WriteValue(node.ChildNodes[0].Value);
                }
                else if (node.ChildNodes.Count == 0 && CollectionUtils.IsNullOrEmpty <IXmlNode>(node.Attributes))
                {
                    writer.WriteNull();
                }
                else
                {
                    writer.WriteStartObject();
                    for (int i = 0; i < node.Attributes.Count; i++)
                    {
                        this.SerializeNode(writer, node.Attributes[i], manager, true);
                    }
                    this.SerializeGroupedNodes(writer, node, manager, true);
                    writer.WriteEndObject();
                }
                manager.PopScope();
                return;

            case XmlNodeType.Attribute:
            case XmlNodeType.Text:
            case XmlNodeType.CDATA:
            case XmlNodeType.ProcessingInstruction:
            case XmlNodeType.Whitespace:
            case XmlNodeType.SignificantWhitespace:
                if (node.NamespaceUri == "http://www.w3.org/2000/xmlns/" && node.Value == "http://james.newtonking.com/projects/json")
                {
                    return;
                }
                if (node.NamespaceUri == "http://james.newtonking.com/projects/json" && node.LocalName == "Array")
                {
                    return;
                }
                if (writePropertyName)
                {
                    writer.WritePropertyName(this.GetPropertyName(node, manager));
                }
                writer.WriteValue(node.Value);
                return;

            case XmlNodeType.Comment:
                if (writePropertyName)
                {
                    writer.WriteComment(node.Value);
                    return;
                }
                return;

            case XmlNodeType.Document:
            case XmlNodeType.DocumentFragment:
                this.SerializeGroupedNodes(writer, node, manager, writePropertyName);
                return;

            case XmlNodeType.XmlDeclaration:
            {
                IXmlDeclaration xmlDeclaration = (IXmlDeclaration)node;
                writer.WritePropertyName(this.GetPropertyName(node, manager));
                writer.WriteStartObject();
                if (!string.IsNullOrEmpty(xmlDeclaration.Version))
                {
                    writer.WritePropertyName("@version");
                    writer.WriteValue(xmlDeclaration.Version);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Encoding))
                {
                    writer.WritePropertyName("@encoding");
                    writer.WriteValue(xmlDeclaration.Encoding);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Standalone))
                {
                    writer.WritePropertyName("@standalone");
                    writer.WriteValue(xmlDeclaration.Standalone);
                }
                writer.WriteEndObject();
                return;
            }
            }
            throw new JsonSerializationException("Unexpected XmlNodeType when serializing nodes: " + node.NodeType);
        }
Esempio n. 5
0
        private void SerializeNode(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName)
        {
            switch (node.NodeType)
            {
            case XmlNodeType.Element:
                if (this.IsArray(node) && (Enumerable.All <IXmlNode>((IEnumerable <IXmlNode>)node.ChildNodes, (Func <IXmlNode, bool>)(n => n.LocalName == node.LocalName)) && node.ChildNodes.Count > 0))
                {
                    this.SerializeGroupedNodes(writer, node, manager, false);
                    break;
                }
                else
                {
                    foreach (IXmlNode xmlNode in (IEnumerable <IXmlNode>)node.Attributes)
                    {
                        if (xmlNode.NamespaceUri == "http://www.w3.org/2000/xmlns/")
                        {
                            string prefix = xmlNode.LocalName != "xmlns" ? xmlNode.LocalName : string.Empty;
                            manager.AddNamespace(prefix, xmlNode.Value);
                        }
                    }
                    if (writePropertyName)
                    {
                        writer.WritePropertyName(this.GetPropertyName(node, manager));
                    }
                    if (!Enumerable.Any <IXmlNode>(this.ValueAttributes((IEnumerable <IXmlNode>)node.Attributes)) && node.ChildNodes.Count == 1 && node.ChildNodes[0].NodeType == XmlNodeType.Text)
                    {
                        writer.WriteValue(node.ChildNodes[0].Value);
                        break;
                    }
                    else if (node.ChildNodes.Count == 0 && CollectionUtils.IsNullOrEmpty <IXmlNode>((ICollection <IXmlNode>)node.Attributes))
                    {
                        writer.WriteNull();
                        break;
                    }
                    else
                    {
                        writer.WriteStartObject();
                        for (int index = 0; index < node.Attributes.Count; ++index)
                        {
                            this.SerializeNode(writer, node.Attributes[index], manager, true);
                        }
                        this.SerializeGroupedNodes(writer, node, manager, true);
                        writer.WriteEndObject();
                        break;
                    }
                }

            case XmlNodeType.Attribute:
            case XmlNodeType.Text:
            case XmlNodeType.CDATA:
            case XmlNodeType.ProcessingInstruction:
            case XmlNodeType.Whitespace:
            case XmlNodeType.SignificantWhitespace:
                if (node.NamespaceUri == "http://www.w3.org/2000/xmlns/" && node.Value == "http://james.newtonking.com/projects/json" || node.NamespaceUri == "http://james.newtonking.com/projects/json" && node.LocalName == "Array")
                {
                    break;
                }
                if (writePropertyName)
                {
                    writer.WritePropertyName(this.GetPropertyName(node, manager));
                }
                writer.WriteValue(node.Value);
                break;

            case XmlNodeType.Comment:
                if (!writePropertyName)
                {
                    break;
                }
                writer.WriteComment(node.Value);
                break;

            case XmlNodeType.Document:
            case XmlNodeType.DocumentFragment:
                this.SerializeGroupedNodes(writer, node, manager, writePropertyName);
                break;

            case XmlNodeType.XmlDeclaration:
                IXmlDeclaration xmlDeclaration = (IXmlDeclaration)node;
                writer.WritePropertyName(this.GetPropertyName(node, manager));
                writer.WriteStartObject();
                if (!string.IsNullOrEmpty(xmlDeclaration.Version))
                {
                    writer.WritePropertyName("@version");
                    writer.WriteValue(xmlDeclaration.Version);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Encoding))
                {
                    writer.WritePropertyName("@encoding");
                    writer.WriteValue(xmlDeclaration.Encoding);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Standalone))
                {
                    writer.WritePropertyName("@standalone");
                    writer.WriteValue(xmlDeclaration.Standalone);
                }
                writer.WriteEndObject();
                break;

            default:
                throw new JsonSerializationException("Unexpected XmlNodeType when serializing nodes: " + (object)node.NodeType);
            }
        }
Esempio n. 6
0
        private void SerializeNode(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName)
        {
            switch (node.NodeType)
            {
            case XmlNodeType.Element:
                if ((!this.IsArray(node) || !AllSameName(node)) || (node.ChildNodes.Count <= 0))
                {
                    manager.PushScope();
                    foreach (IXmlNode node2 in node.Attributes)
                    {
                        if (node2.NamespaceUri == "http://www.w3.org/2000/xmlns/")
                        {
                            string prefix = (node2.LocalName != "xmlns") ? XmlConvert.DecodeName(node2.LocalName) : string.Empty;
                            string uri    = node2.Value;
                            manager.AddNamespace(prefix, uri);
                        }
                    }
                    if (writePropertyName)
                    {
                        writer.WritePropertyName(this.GetPropertyName(node, manager));
                    }
                    if ((!this.ValueAttributes(node.Attributes) && (node.ChildNodes.Count == 1)) && (node.ChildNodes[0].NodeType == XmlNodeType.Text))
                    {
                        writer.WriteValue(node.ChildNodes[0].Value);
                    }
                    else if ((node.ChildNodes.Count == 0) && CollectionUtils.IsNullOrEmpty <IXmlNode>(node.Attributes))
                    {
                        if (((IXmlElement)node).IsEmpty)
                        {
                            writer.WriteNull();
                        }
                        else
                        {
                            writer.WriteValue(string.Empty);
                        }
                    }
                    else
                    {
                        writer.WriteStartObject();
                        for (int i = 0; i < node.Attributes.Count; i++)
                        {
                            this.SerializeNode(writer, node.Attributes[i], manager, true);
                        }
                        this.SerializeGroupedNodes(writer, node, manager, true);
                        writer.WriteEndObject();
                    }
                    manager.PopScope();
                    return;
                }
                this.SerializeGroupedNodes(writer, node, manager, false);
                return;

            case XmlNodeType.Attribute:
            case XmlNodeType.Text:
            case XmlNodeType.CDATA:
            case XmlNodeType.ProcessingInstruction:
            case XmlNodeType.Whitespace:
            case XmlNodeType.SignificantWhitespace:
                if ((node.NamespaceUri != "http://www.w3.org/2000/xmlns/") || (node.Value != "http://james.newtonking.com/projects/json"))
                {
                    if ((node.NamespaceUri != "http://james.newtonking.com/projects/json") || (node.LocalName != "Array"))
                    {
                        if (writePropertyName)
                        {
                            writer.WritePropertyName(this.GetPropertyName(node, manager));
                        }
                        writer.WriteValue(node.Value);
                    }
                    return;
                }
                return;

            case XmlNodeType.Comment:
                if (writePropertyName)
                {
                    writer.WriteComment(node.Value);
                }
                return;

            case XmlNodeType.Document:
            case XmlNodeType.DocumentFragment:
                this.SerializeGroupedNodes(writer, node, manager, writePropertyName);
                return;

            case XmlNodeType.DocumentType:
            {
                IXmlDocumentType type2 = (IXmlDocumentType)node;
                writer.WritePropertyName(this.GetPropertyName(node, manager));
                writer.WriteStartObject();
                if (!string.IsNullOrEmpty(type2.Name))
                {
                    writer.WritePropertyName("@name");
                    writer.WriteValue(type2.Name);
                }
                if (!string.IsNullOrEmpty(type2.Public))
                {
                    writer.WritePropertyName("@public");
                    writer.WriteValue(type2.Public);
                }
                if (!string.IsNullOrEmpty(type2.System))
                {
                    writer.WritePropertyName("@system");
                    writer.WriteValue(type2.System);
                }
                if (!string.IsNullOrEmpty(type2.InternalSubset))
                {
                    writer.WritePropertyName("@internalSubset");
                    writer.WriteValue(type2.InternalSubset);
                }
                writer.WriteEndObject();
                return;
            }

            case XmlNodeType.XmlDeclaration:
            {
                IXmlDeclaration declaration = (IXmlDeclaration)node;
                writer.WritePropertyName(this.GetPropertyName(node, manager));
                writer.WriteStartObject();
                if (!string.IsNullOrEmpty(declaration.Version))
                {
                    writer.WritePropertyName("@version");
                    writer.WriteValue(declaration.Version);
                }
                if (!string.IsNullOrEmpty(declaration.Encoding))
                {
                    writer.WritePropertyName("@encoding");
                    writer.WriteValue(declaration.Encoding);
                }
                if (!string.IsNullOrEmpty(declaration.Standalone))
                {
                    writer.WritePropertyName("@standalone");
                    writer.WriteValue(declaration.Standalone);
                }
                writer.WriteEndObject();
                return;
            }
            }
            throw new JsonSerializationException("Unexpected XmlNodeType when serializing nodes: " + node.NodeType);
        }
Esempio n. 7
0
        private void SerializeNode(
            JsonWriter writer,
            IXmlNode node,
            XmlNamespaceManager manager,
            bool writePropertyName)
        {
            switch (node.NodeType)
            {
            case XmlNodeType.Element:
                if (this.IsArray(node) && XmlNodeConverter.AllSameName(node) && node.ChildNodes.Count > 0)
                {
                    this.SerializeGroupedNodes(writer, node, manager, false);
                    break;
                }

                manager.PushScope();
                foreach (IXmlNode attribute in node.Attributes)
                {
                    if (attribute.NamespaceUri == "http://www.w3.org/2000/xmlns/")
                    {
                        string prefix = attribute.LocalName != "xmlns"
                ? XmlConvert.DecodeName(attribute.LocalName)
                : string.Empty;
                        string uri = attribute.Value;
                        manager.AddNamespace(prefix, uri);
                    }
                }

                if (writePropertyName)
                {
                    writer.WritePropertyName(this.GetPropertyName(node, manager));
                }
                if (!this.ValueAttributes(node.Attributes) && node.ChildNodes.Count == 1 &&
                    node.ChildNodes[0].NodeType == XmlNodeType.Text)
                {
                    writer.WriteValue(node.ChildNodes[0].Value);
                }
                else if (node.ChildNodes.Count == 0 && node.Attributes.Count == 0)
                {
                    if (((IXmlElement)node).IsEmpty)
                    {
                        writer.WriteNull();
                    }
                    else
                    {
                        writer.WriteValue(string.Empty);
                    }
                }
                else
                {
                    writer.WriteStartObject();
                    for (int index = 0; index < node.Attributes.Count; ++index)
                    {
                        this.SerializeNode(writer, node.Attributes[index], manager, true);
                    }
                    this.SerializeGroupedNodes(writer, node, manager, true);
                    writer.WriteEndObject();
                }

                manager.PopScope();
                break;

            case XmlNodeType.Attribute:
            case XmlNodeType.Text:
            case XmlNodeType.CDATA:
            case XmlNodeType.ProcessingInstruction:
            case XmlNodeType.Whitespace:
            case XmlNodeType.SignificantWhitespace:
                if (node.NamespaceUri == "http://www.w3.org/2000/xmlns/" &&
                    node.Value == "http://james.newtonking.com/projects/json" ||
                    node.NamespaceUri == "http://james.newtonking.com/projects/json" && node.LocalName == "Array")
                {
                    break;
                }
                if (writePropertyName)
                {
                    writer.WritePropertyName(this.GetPropertyName(node, manager));
                }
                writer.WriteValue(node.Value);
                break;

            case XmlNodeType.Comment:
                if (!writePropertyName)
                {
                    break;
                }
                writer.WriteComment(node.Value);
                break;

            case XmlNodeType.Document:
            case XmlNodeType.DocumentFragment:
                this.SerializeGroupedNodes(writer, node, manager, writePropertyName);
                break;

            case XmlNodeType.DocumentType:
                IXmlDocumentType xmlDocumentType = (IXmlDocumentType)node;
                writer.WritePropertyName(this.GetPropertyName(node, manager));
                writer.WriteStartObject();
                if (!string.IsNullOrEmpty(xmlDocumentType.Name))
                {
                    writer.WritePropertyName("@name");
                    writer.WriteValue(xmlDocumentType.Name);
                }

                if (!string.IsNullOrEmpty(xmlDocumentType.Public))
                {
                    writer.WritePropertyName("@public");
                    writer.WriteValue(xmlDocumentType.Public);
                }

                if (!string.IsNullOrEmpty(xmlDocumentType.System))
                {
                    writer.WritePropertyName("@system");
                    writer.WriteValue(xmlDocumentType.System);
                }

                if (!string.IsNullOrEmpty(xmlDocumentType.InternalSubset))
                {
                    writer.WritePropertyName("@internalSubset");
                    writer.WriteValue(xmlDocumentType.InternalSubset);
                }

                writer.WriteEndObject();
                break;

            case XmlNodeType.XmlDeclaration:
                IXmlDeclaration xmlDeclaration = (IXmlDeclaration)node;
                writer.WritePropertyName(this.GetPropertyName(node, manager));
                writer.WriteStartObject();
                if (!string.IsNullOrEmpty(xmlDeclaration.Version))
                {
                    writer.WritePropertyName("@version");
                    writer.WriteValue(xmlDeclaration.Version);
                }

                if (!string.IsNullOrEmpty(xmlDeclaration.Encoding))
                {
                    writer.WritePropertyName("@encoding");
                    writer.WriteValue(xmlDeclaration.Encoding);
                }

                if (!string.IsNullOrEmpty(xmlDeclaration.Standalone))
                {
                    writer.WritePropertyName("@standalone");
                    writer.WriteValue(xmlDeclaration.Standalone);
                }

                writer.WriteEndObject();
                break;

            default:
                throw new JsonSerializationException("Unexpected XmlNodeType when serializing nodes: " +
                                                     (object)node.NodeType);
            }
        }
        private void SerializeNode(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName)
        {
            switch (node.NodeType)
            {
            case 1:
                if (this.IsArray(node) && Enumerable.All <IXmlNode>(node.ChildNodes, (IXmlNode n) => n.LocalName == node.LocalName) && node.ChildNodes.get_Count() > 0)
                {
                    this.SerializeGroupedNodes(writer, node, manager, false);
                }
                else
                {
                    using (IEnumerator <IXmlNode> enumerator = node.Attributes.GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            IXmlNode current = enumerator.get_Current();
                            if (current.NamespaceURI == "http://www.w3.org/2000/xmlns/")
                            {
                                string text = (!(current.LocalName != "xmlns")) ? string.Empty : current.LocalName;
                                manager.AddNamespace(text, current.Value);
                            }
                        }
                    }
                    if (writePropertyName)
                    {
                        writer.WritePropertyName(this.GetPropertyName(node, manager));
                    }
                    if (Enumerable.Count <IXmlNode>(this.ValueAttributes(node.Attributes)) == 0 && node.ChildNodes.get_Count() == 1 && node.ChildNodes.get_Item(0).NodeType == 3)
                    {
                        writer.WriteValue(node.ChildNodes.get_Item(0).Value);
                    }
                    else if (node.ChildNodes.get_Count() == 0 && CollectionUtils.IsNullOrEmpty <IXmlNode>(node.Attributes))
                    {
                        writer.WriteNull();
                    }
                    else
                    {
                        writer.WriteStartObject();
                        for (int i = 0; i < node.Attributes.get_Count(); i++)
                        {
                            this.SerializeNode(writer, node.Attributes.get_Item(i), manager, true);
                        }
                        this.SerializeGroupedNodes(writer, node, manager, true);
                        writer.WriteEndObject();
                    }
                }
                return;

            case 2:
            case 3:
            case 4:
            case 7:
            case 13:
            case 14:
                if (node.NamespaceURI == "http://www.w3.org/2000/xmlns/" && node.Value == "http://james.newtonking.com/projects/json")
                {
                    return;
                }
                if (node.NamespaceURI == "http://james.newtonking.com/projects/json" && node.LocalName == "Array")
                {
                    return;
                }
                if (writePropertyName)
                {
                    writer.WritePropertyName(this.GetPropertyName(node, manager));
                }
                writer.WriteValue(node.Value);
                return;

            case 8:
                if (writePropertyName)
                {
                    writer.WriteComment(node.Value);
                }
                return;

            case 9:
            case 11:
                this.SerializeGroupedNodes(writer, node, manager, writePropertyName);
                return;

            case 17:
            {
                IXmlDeclaration xmlDeclaration = (IXmlDeclaration)node;
                writer.WritePropertyName(this.GetPropertyName(node, manager));
                writer.WriteStartObject();
                if (!string.IsNullOrEmpty(xmlDeclaration.Version))
                {
                    writer.WritePropertyName("@version");
                    writer.WriteValue(xmlDeclaration.Version);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Encoding))
                {
                    writer.WritePropertyName("@encoding");
                    writer.WriteValue(xmlDeclaration.Encoding);
                }
                if (!string.IsNullOrEmpty(xmlDeclaration.Standalone))
                {
                    writer.WritePropertyName("@standalone");
                    writer.WriteValue(xmlDeclaration.Standalone);
                }
                writer.WriteEndObject();
                return;
            }
            }
            throw new JsonSerializationException("Unexpected XmlNodeType when serializing nodes: " + node.NodeType);
        }