using System.Collections.Generic;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO.Compression;
@ManInMoon - setting `table.Columns["utcDT"].DateTimeMode = DataSetDateTime.Utc;` seems to generate the correct output: `utcDT>2019-11-19T21:08:00Z</utcDT>`. See: https:
Incidentally, after setting `DateTimeMode ` the schema for `"utcDT"` changes as follows: `<xs:element name="utcDT" msdata:DateTimeMode="Utc" type="xs:dateTime" minOccurs="0" />`. Note the addition of the `msdata:DateTimeMode` attribute.
static string GetDataSetXsd()
return @"<xs:schema id=""NewDataSet"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
<xs:element name=""NewDataSet"" msdata:IsDataSet=""true"" msdata:MainDataTable=""Test"" msdata:Locale=""en-US"">
<xs:choice minOccurs=""0"" maxOccurs=""unbounded"">
<xs:element name=""Test"" msdata:Locale=""en-US"">
<xs:element name=""utcDT"" type=""xs:dateTime"" minOccurs=""0"" />
<xs:element name=""Symbol"" type=""xs:string"" minOccurs=""0"" />
<xs:element name=""Close"" type=""xs:double"" minOccurs=""0"" />
static DataSet CreateDataSet()
DataSet ds = new DataSet();
using (var reader = new StringReader(GetDataSetXsd()))
ds.ReadXmlSchema(reader);
var table = ds.Tables[0];
table.Columns["utcDT"].DateTimeMode = DataSetDateTime.Utc;
var row = table.NewRow();
row["utcDT"] = DateTime.Parse("2019-11-19T16:08:00-05:00").ToUniversalTime();
row["Symbol"] = "Widget";
public static void Test()
var ZeroMQTopic = "Test";
var ds = CreateDataSet();
var table = ds.Tables[0];
StringWriter sw = new StringWriter();
table.TableName = ZeroMQTopic;
table.WriteXml(sw, XmlWriteMode.WriteSchema);
string tableXML = sw.ToString();
Console.WriteLine(tableXML);
public static class XmlSerializationHelper
public static T LoadFromXml<T>(this string xmlString, XmlSerializer serial = null)
serial = serial ?? new XmlSerializer(typeof(T));
using (var reader = new StringReader(xmlString))
return (T)serial.Deserialize(reader);
public static string GetXml<T>(this T obj, XmlSerializer serializer = null, bool omitStandardNamespaces = false)
XmlSerializerNamespaces ns = null;
if (omitStandardNamespaces)
ns = new XmlSerializerNamespaces();
using (var textWriter = new StringWriter())
var settings = new XmlWriterSettings() { Indent = true };
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
(serializer ?? new XmlSerializer(obj.GetType())).Serialize(xmlWriter, obj, ns);
return textWriter.ToString();
public static string GetOuterXml(this XmlNode node, bool indent = true)
using (var textWriter = new StringWriter())
var settings = new XmlWriterSettings
OmitXmlDeclaration = true,
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
return textWriter.ToString();
public static class XmlAssert
public static void AreEqual(
Assert.IsTrue(XNode.DeepEquals(Normalize(expected), Normalize(actual)));
private static XElement Normalize(XElement element)
.OrderBy(a => a.Name.ToString()),
.OrderBy(a => a.Name.ToString())
.Select(e => Normalize(e)));
.OrderBy(a => a.Name.ToString()));
return new XElement(element.Name, element.Attributes()
.OrderBy(a => a.Name.ToString()), element.Value);
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.CodeBase.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];