private void ToXmlCore( EmberReader reader, XmlWriter writer, FieldPath <int, EmberId> previousPath, int currentType) { while (reader.Read()) { var nextType = reader.InnerNumber; if (nextType == InnerNumber.EndContainer) { writer.WriteEndElement(); return; } var currentPath = Combine(previousPath, new Field <int, EmberId>(currentType, reader.OuterId)); var fieldName = this.GetFieldName(currentPath); switch (nextType) { case BerBoolean.InnerNumber: var boolean = reader.ReadContentsAsBoolean(); WriteValue(writer, fieldName, BerBoolean.Name, boolean, (w, o) => w.WriteValue(o)); break; case BerInteger.InnerNumber: var integer = reader.ReadContentsAsInt64(); WriteValue(writer, fieldName, BerInteger.Name, integer, (w, o) => w.WriteValue(o)); break; case BerReal.InnerNumber: WriteValue( writer, fieldName, BerReal.Name, reader.ReadContentsAsDouble(), (w, o) => w.WriteValue(o)); break; case BerUtf8String.InnerNumber: string str; try { str = XmlConvert.VerifyXmlChars(reader.ReadContentsAsString()); } catch (XmlException) { str = "*** CONTAINS INVALID XML CHARACTERS ***"; } switch (currentPath.ToString()) { case "1073741825.C-1.C-6": case "1073741825.C-1.C-7": case "1073741825.C-1.C-17": case "1073741833.C-1.C-6": case "1073741833.C-1.C-7": case "1073741833.C-1.C-17": case "1073741827.C-1.C-4": case "1073741834.C-1.C-4": case "1073741837.C-1.C-11": case "1073741841.C-1.C-11": str = str.Replace("\n", Environment.NewLine); break; default: // Intentionally do nothing break; } WriteValue(writer, fieldName, BerUtf8String.Name, str, (w, o) => w.WriteValue(o)); break; case BerOctetstring.InnerNumber: var bytes = reader.ReadContentsAsByteArray(); WriteValue( writer, fieldName, BerOctetstring.Name, bytes, (w, o) => w.WriteBinHex(o, 0, o.Length)); break; case BerRelativeObjectIdentifier.InnerNumber: var intOid = reader.ReadContentsAsInt32Array(); var oid = string.Join(".", intOid.Select(e => e.ToString(InvariantCulture))); WriteValue(writer, fieldName, BerRelativeObjectIdentifier.Name, oid, (w, o) => w.WriteValue(o)); break; case BerSequence.InnerNumber: WriteStartContainer(writer, fieldName, BerSequence.Name); this.ToXmlCore(reader, writer, currentPath, nextType); break; case BerSet.InnerNumber: WriteStartContainer(writer, fieldName, BerSet.Name); this.ToXmlCore(reader, writer, currentPath, nextType); break; default: WriteStartContainer(writer, fieldName, this.GetTypeName(nextType)); this.ToXmlCore(reader, writer, currentPath, nextType); break; } } }