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); } }
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); } }
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); }
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); } }
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); }
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); }