diff --git a/ICD.Common.Utils.Tests/Xml/IcdXmlConvertTest.cs b/ICD.Common.Utils.Tests/Xml/IcdXmlConvertTest.cs new file mode 100644 index 0000000..0a9fa49 --- /dev/null +++ b/ICD.Common.Utils.Tests/Xml/IcdXmlConvertTest.cs @@ -0,0 +1,35 @@ +using System.Linq; +using ICD.Common.Utils.Xml; +using NUnit.Framework; + +namespace ICD.Common.Utils.Tests.Xml +{ + [TestFixture] + public sealed class IcdXmlConvertTest + { + [Test] + public void DeserializeArrayGenericTest() + { + const string xml = @" + 1 + 2 +"; + + using (IcdXmlReader reader = new IcdXmlReader(xml)) + { + // Read to the first element + reader.Read(); + + int[] values = IcdXmlConvert.DeserializeArray(reader).ToArray(); + + Assert.AreEqual(new[] {1, 2}, values); + } + } + + [Test] + public void DeserializeArrayTest() + { + Assert.Inconclusive(); + } + } +} diff --git a/ICD.Common.Utils/Xml/IcdXmlConvert.cs b/ICD.Common.Utils/Xml/IcdXmlConvert.cs index 11f8034..5cc796a 100644 --- a/ICD.Common.Utils/Xml/IcdXmlConvert.cs +++ b/ICD.Common.Utils/Xml/IcdXmlConvert.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Globalization; +using System.Linq; using System.Text; using ICD.Common.Utils.IO; #if SIMPLSHARP @@ -112,6 +114,64 @@ namespace ICD.Common.Utils.Xml return converter.ReadXml(reader); } + /// + /// Deserializes the child elements as items in an array. + /// + /// + /// + /// + public static IEnumerable DeserializeArray(IcdXmlReader reader) + { + if (reader == null) + throw new ArgumentNullException("reader"); + + return DeserializeArray(typeof(T), reader).Cast(); + } + + /// + /// Deserializes the child elements as items in an array. + /// + /// + /// + /// + public static IEnumerable DeserializeArray(Type type, IcdXmlReader reader) + { + if (type == null) + throw new ArgumentNullException("type"); + + if (reader == null) + throw new ArgumentNullException("reader"); + + if (reader.NodeType != XmlNodeType.Element) + throw new FormatException("Expected start element for array"); + + string arrayName = reader.Name; + + // Read into the first element + do + { + reader.Read(); + } while (reader.NodeType != XmlNodeType.Element && reader.NodeType != XmlNodeType.EndElement); + + // Empty array + if (reader.NodeType == XmlNodeType.EndElement) + yield break; + + // Read the items + IXmlConverter converter = XmlConverterAttribute.GetConverterForType(type); + while (reader.NodeType != XmlNodeType.EndElement) + { + yield return converter.ReadXml(reader); + reader.SkipInsignificantWhitespace(); + } + + if (reader.NodeType != XmlNodeType.EndElement || reader.Name != arrayName) + throw new FormatException("Expected end element for array"); + + // Read out of the array end element + reader.Read(); + } + public static string ToString(int value) { return XmlConvert.ToString(value);