diff --git a/src/Umbraco.Core/Dynamics/DynamicXml.cs b/src/Umbraco.Core/Dynamics/DynamicXml.cs index a6a7441580..f0942d02a8 100644 --- a/src/Umbraco.Core/Dynamics/DynamicXml.cs +++ b/src/Umbraco.Core/Dynamics/DynamicXml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Dynamic; using System.Reflection; @@ -11,7 +12,8 @@ using System.Web; namespace Umbraco.Core.Dynamics { - public class DynamicXml : DynamicObject, IEnumerable, IEnumerable + [TypeConverter(typeof(DynamicXmlConverter))] + public class DynamicXml : DynamicObject, IEnumerable, IEnumerable { public XElement BaseElement { get; set; } @@ -213,6 +215,16 @@ namespace Umbraco.Core.Dynamics } return root; } + + /// + /// Return the string version of Xml + /// + /// + public override string ToString() + { + return ToXml(); + } + public IHtmlString ToHtml() { return new HtmlString(this.ToXml()); diff --git a/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs b/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs new file mode 100644 index 0000000000..2c3f597cd3 --- /dev/null +++ b/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs @@ -0,0 +1,59 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Linq; +using System.Xml; +using System.Xml.Linq; + +namespace Umbraco.Core.Dynamics +{ + /// + /// A custom type converter for DynamicXml + /// + public class DynamicXmlConverter : TypeConverter + { + public override bool CanConvertTo(ITypeDescriptorContext context, Type sourceType) + { + var convertableTypes = new[] {typeof(string), typeof(XElement), typeof(XmlElement), typeof(XmlDocument)}; + + return convertableTypes.Any(x => TypeHelper.IsTypeAssignableFrom(x, sourceType)) + || base.CanConvertFrom(context, sourceType); + } + + public override object ConvertTo( + ITypeDescriptorContext context, + CultureInfo culture, + object value, + Type destinationType) + { + var dxml = value as DynamicXml; + if (dxml == null) + return null; + //string + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + return value.ToString(); + } + //XElement + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + return dxml.BaseElement; + } + //XmlElement + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + var xDoc = new XmlDocument(); + xDoc.LoadXml(dxml.ToString()); + return xDoc.DocumentElement; + } + //XmlDocument + if (TypeHelper.IsTypeAssignableFrom(destinationType)) + { + var xDoc = new XmlDocument(); + xDoc.LoadXml(dxml.ToString()); + return xDoc; + } + return base.ConvertTo(context, culture, value, destinationType); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index c957a76178..15015c77f6 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -118,6 +118,7 @@ + diff --git a/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs b/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs index 7c1a3598fb..4fc304730a 100644 --- a/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs +++ b/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs @@ -1,12 +1,69 @@ using System; using System.Diagnostics; +using System.Xml; +using System.Xml.Linq; using Microsoft.CSharp.RuntimeBinder; using NUnit.Framework; using Umbraco.Core.Dynamics; using System.Linq; +using Umbraco.Tests.PartialTrust; +using Umbraco.Core; namespace Umbraco.Tests.PublishedContent { + [TestFixture] + public class DynamicXmlConverterTests : AbstractPartialTrustFixture + { + [Test] + public void Convert_To_String() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var dXml = new DynamicXml(xml); + var result = dXml.TryConvertTo(); + Assert.IsTrue(result.Success); + Assert.AreEqual(xml, result.Result); + } + + [Test] + public void Convert_To_XElement() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var dXml = new DynamicXml(xml); + var result = dXml.TryConvertTo(); + Assert.IsTrue(result.Success); + Assert.AreEqual(xml, result.Result.ToString(SaveOptions.DisableFormatting)); + } + + [Test] + public void Convert_To_XmlElement() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var dXml = new DynamicXml(xml); + var result = dXml.TryConvertTo(); + Assert.IsTrue(result.Success); + Assert.AreEqual(xml, result.Result.OuterXml); + } + + [Test] + public void Convert_To_XmlDocument() + { + var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; + var dXml = new DynamicXml(xml); + var result = dXml.TryConvertTo(); + Assert.IsTrue(result.Success); + Assert.AreEqual(xml, result.Result.InnerXml); + } + + public override void TestSetup() + { + + } + + public override void TestTearDown() + { + } + } + [TestFixture] public class DynamicXmlTests {