mirror of
https://github.com/ICDSystems/ICD.Common.Utils.git
synced 2026-01-11 19:44:55 +00:00
feat: Adding methods for deserializing an XML array of items
This commit is contained in:
35
ICD.Common.Utils.Tests/Xml/IcdXmlConvertTest.cs
Normal file
35
ICD.Common.Utils.Tests/Xml/IcdXmlConvertTest.cs
Normal file
@@ -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 = @"<A>
|
||||
<B>1</B>
|
||||
<B>2</B>
|
||||
</A>";
|
||||
|
||||
using (IcdXmlReader reader = new IcdXmlReader(xml))
|
||||
{
|
||||
// Read to the first element
|
||||
reader.Read();
|
||||
|
||||
int[] values = IcdXmlConvert.DeserializeArray<int>(reader).ToArray();
|
||||
|
||||
Assert.AreEqual(new[] {1, 2}, values);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DeserializeArrayTest()
|
||||
{
|
||||
Assert.Inconclusive();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deserializes the child elements as items in an array.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="reader"></param>
|
||||
/// <returns></returns>
|
||||
public static IEnumerable<T> DeserializeArray<T>(IcdXmlReader reader)
|
||||
{
|
||||
if (reader == null)
|
||||
throw new ArgumentNullException("reader");
|
||||
|
||||
return DeserializeArray(typeof(T), reader).Cast<T>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deserializes the child elements as items in an array.
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="reader"></param>
|
||||
/// <returns></returns>
|
||||
public static IEnumerable<object> 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);
|
||||
|
||||
Reference in New Issue
Block a user