mirror of
https://github.com/ICDSystems/ICD.Common.Utils.git
synced 2026-02-16 05:05:05 +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;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using ICD.Common.Utils.IO;
|
using ICD.Common.Utils.IO;
|
||||||
#if SIMPLSHARP
|
#if SIMPLSHARP
|
||||||
@@ -112,6 +114,64 @@ namespace ICD.Common.Utils.Xml
|
|||||||
return converter.ReadXml(reader);
|
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)
|
public static string ToString(int value)
|
||||||
{
|
{
|
||||||
return XmlConvert.ToString(value);
|
return XmlConvert.ToString(value);
|
||||||
|
|||||||
Reference in New Issue
Block a user