diff --git a/source/FluentDataBuilder.ExtensionTests/Xml/BuildTests.cs b/source/FluentDataBuilder.ExtensionTests/Xml/BuildTests.cs index 2b52b7e..c5b4df5 100644 --- a/source/FluentDataBuilder.ExtensionTests/Xml/BuildTests.cs +++ b/source/FluentDataBuilder.ExtensionTests/Xml/BuildTests.cs @@ -13,9 +13,8 @@ public void Build_WithChildObject_Returns() IDataBuilder builder = new DataBuilder(); builder.Add("id", "7c27a562-d405-4b22-9ade-37503bed6014"); - var jsonProperty = builder.Add("name", "John Doe"); - - var jsonObject = builder.Add("editor", new DataBuilder() + builder.Add("name", "John Doe"); + builder.Add("editor", new DataBuilder() .Add("typevalue", "a object") .Add("numbervalue", 55865) .Add("booleanvalue", true)); @@ -130,7 +129,19 @@ public void Build_WithArrayWithAllDataTypes_Returns() IDataBuilder builder = new DataBuilder(); builder.Add("name", "this is a test"); - builder.Add("array", new List { (int)15.123412341234, (double)15.123412341234, (float)16.123412341234, false, (decimal)9.123412341234, "test", 'x', (long)9876.123412341234, (ulong)9876.123412341234 }.ToArray()); + builder.Add("array", + new List + { + (int)15.123412341234, + (double)15.123412341234, + (float)16.123412341234, + false, + (decimal)9.123412341234, + "test", + 'x', + (long)9876.123412341234, + (ulong)9876.123412341234 + }.ToArray()); XmlDocument xmlDocument = builder.Build(); @@ -139,4 +150,73 @@ public void Build_WithArrayWithAllDataTypes_Returns() result.Should().NotBeNullOrEmpty(); result.Should().Be("this is a test1515.12341234123416.123413False9.123412341234testx98769876"); } + + [TestMethod] + public void LoadFrom_WithJsonDocumentNull_Returns() + { + XmlDocument? data = null; + IDataBuilder builder = new DataBuilder().LoadFrom(data!); + + builder.Should().NotBeNull(); + builder.GetProperties().Count.Should().Be(0); + } + + [TestMethod] + public void LoadFrom_WithSimpleJson_Returns() + { + string dataValue = """ + + this is a test + 123 + 123.45 + true + + + this + is + a + test + + + this is a test + 123 + 123.45 + true + + + this + is + a + test + + + + """; + + var data = new XmlDocument(); + data.LoadXml(dataValue); + + IDataBuilder builder = new DataBuilder().LoadFrom(data); + + builder.Should().NotBeNull(); + var properties = builder.GetProperties(); + properties.Count.Should().Be(7); + properties["name"].Should().Be("this is a test"); + properties["number"].Should().Be(123); + properties["decimal"].Should().Be(123.45); + properties["boolean"].Should().Be(true); + properties["null"].Should().BeNull(); + properties["array"].Should().BeOfType(); + properties["array"].Should().BeEquivalentTo(new List { "this", "is", "a", "test" }); + properties["object"].Should().BeOfType>(); + properties["object"].Should().BeEquivalentTo(new Dictionary + { + { "name", "this is a test" }, + { "number", 123 }, + { "decimal", 123.45 }, + { "boolean", true }, + { "null", null! }, + { "array", new List { "this", "is", "a", "test" } } + }); + } } \ No newline at end of file diff --git a/source/FluentDataBuilder.Json/DataBuilderExtensions.cs b/source/FluentDataBuilder.Json/DataBuilderExtensions.cs index 0d3e8a6..a887e8c 100644 --- a/source/FluentDataBuilder.Json/DataBuilderExtensions.cs +++ b/source/FluentDataBuilder.Json/DataBuilderExtensions.cs @@ -63,9 +63,7 @@ public static IDataBuilder LoadFrom(this IDataBuilder builder, JsonElement json) { builder = json .EnumerateObject() - .Aggregate(builder, - (currentBuilder, jsonProperty) => - ConvertToIDataBuilder(currentBuilder, jsonProperty.Name, jsonProperty.Value)); + .Aggregate(builder, (currentBuilder, jsonProperty) => ConvertToIDataBuilder(currentBuilder, jsonProperty.Name, jsonProperty.Value)); return builder; } @@ -91,14 +89,16 @@ public static IDataBuilder LoadFrom(this IDataBuilder builder, string json) builder = jsonDocument.RootElement .EnumerateObject() - .Aggregate(builder, - (currentBuilder, jsonProperty) => - ConvertToIDataBuilder(currentBuilder, jsonProperty.Name, jsonProperty.Value)); + .Aggregate(builder, (currentBuilder, jsonProperty) => ConvertToIDataBuilder(currentBuilder, + jsonProperty.Name, + jsonProperty.Value)); return builder; } - private static IDataBuilder ConvertToIDataBuilder(IDataBuilder builder, string key, JsonElement jsonElement) + private static IDataBuilder ConvertToIDataBuilder(IDataBuilder builder, + string key, + JsonElement jsonElement) { builder.Add(key, GetJsonNode(jsonElement)); diff --git a/source/FluentDataBuilder.Xml/DataBuilderExtensions.cs b/source/FluentDataBuilder.Xml/DataBuilderExtensions.cs index 1dd1e9b..778ed5d 100644 --- a/source/FluentDataBuilder.Xml/DataBuilderExtensions.cs +++ b/source/FluentDataBuilder.Xml/DataBuilderExtensions.cs @@ -18,7 +18,7 @@ public static class DataBuilderExtensions /// public static XmlDocument Build(this IDataBuilder builder) { - XmlDocument xmlDocument = new XmlDocument(); + XmlDocument xmlDocument = new(); XmlElement rootElement = xmlDocument.CreateElement("Root"); xmlDocument.AppendChild(rootElement); @@ -27,7 +27,8 @@ public static XmlDocument Build(this IDataBuilder builder) return xmlDocument; } - private static void CreateXmlElements(Dictionary data, XmlElement parentElement, + private static void CreateXmlElements(Dictionary data, + XmlElement parentElement, XmlDocument xmlDocument) { foreach (KeyValuePair entry in data) @@ -77,4 +78,63 @@ private static void CreateXmlElements(Dictionary data, XmlElemen parentElement.AppendChild(element); } } + + /// + /// Loads data into an IDataBuilder object from a JsonDocument. + /// + /// The IDataBuilder object to load data into. + /// The JsonDocument containing the data to load into the IDataBuilder object. + /// The IDataBuilder object with data loaded from the JsonDocument. + /// + /// This method loads data into the IDataBuilder object from the provided JsonDocument. + /// If the JsonDocument is null, the method returns the original builder unchanged. + /// The method uses an aggregation to iterate over the properties of the JsonDocument's root element and + /// convert each property into IDataBuilder properties, updating the builder. + /// + public static IDataBuilder LoadFrom(this IDataBuilder builder, XmlDocument xmlDocument) + { + if (xmlDocument is null) + { + return builder; + } + + foreach (XmlNode childNode in xmlDocument.ChildNodes) + { + childNode.ChildNodes + .OfType() + .Aggregate(builder, (currentBuilder, xmlElement) => ConvertToIDataBuilder(currentBuilder, xmlElement.Name, xmlElement)); + + } + + return builder; + } + + private static IDataBuilder ConvertToIDataBuilder(IDataBuilder builder, + string key, + XmlElement xmlElement) + { + builder.Add(key, GetXmlNode(xmlElement)); + + return builder; + } + + private static object? GetXmlNode(XmlElement xmlElement) + { + switch (xmlElement.NodeType) + { + case XmlNodeType.Text: + return xmlElement.InnerText; + case XmlNodeType.Element: + return xmlElement.InnerText; + case XmlNodeType.None: + return null; + // case XmlNodeType.Element: + // case XmlNodeType.Document: + // return new DataBuilder() + // .LoadFrom(xmlElement) + // .GetProperties(); + default: + throw new ArgumentOutOfRangeException($"unknown data type: {xmlElement.NodeType}"); + } + } } \ No newline at end of file