diff --git a/src/Umbraco.Core/Dynamics/DynamicXml.cs b/src/Umbraco.Core/Dynamics/DynamicXml.cs index 103128a3b6..a3f9ae7089 100644 --- a/src/Umbraco.Core/Dynamics/DynamicXml.cs +++ b/src/Umbraco.Core/Dynamics/DynamicXml.cs @@ -16,61 +16,82 @@ namespace Umbraco.Core.Dynamics [TypeConverter(typeof(DynamicXmlConverter))] public class DynamicXml : DynamicObject, IEnumerable, IEnumerable { - [Obsolete("Use StrippedXmlElement or RawXmlElement instead")] - public XElement BaseElement - { - get { return StrippedXmlElement; } - //This should have been read only but we're stuck with it now and we'll have to assume that a person is setting the 'raw' xml - set - { - Mandate.ParameterNotNull(value, "value"); - - RawXmlElement = value; - StrippedXmlElement = XElement.Parse( - XmlHelper.StripDashesInElementOrAttributeNames( - RawXmlElement.ToString())); - } - } - - /// + /// /// Returns the XElement used to create the DynamicXml structure /// + public XElement BaseElement { get; set; } + + /// + /// Returns the raw XElement used to create the DynamicXml structure if one was specified otherwise returns the + /// same value as BaseElement. + /// + /// + /// This is purely used for when an instance of DynamicXml is created with the overload that supports + /// passing in both a raw xml version and a dash-stripped xml version. Otherwise this value is exactly the + /// same as BaseElement. + /// public XElement RawXmlElement { get; internal set; } /// - /// Returns the XElement for this DynamicXml structure that has been stripped of all of it's hyphens + /// Constructor /// - public XElement StrippedXmlElement { get; private set; } - + /// public DynamicXml(XElement baseElement) { if (baseElement == null) return; + //same RawXmlElement = baseElement; - StrippedXmlElement = XElement.Parse( - XmlHelper.StripDashesInElementOrAttributeNames( - RawXmlElement.ToString())); + BaseElement = baseElement; } - internal DynamicXml(XElement rawXml, XElement strippedXml) + /// + /// When this constructor is used the BaseElement becomes equivalent to the strippedXml structure + /// + /// + /// + internal DynamicXml(XElement strippedXml, XElement rawXml) { - if (rawXml == null) throw new ArgumentNullException("rawXml"); - if (strippedXml == null) throw new ArgumentNullException("strippedXml"); + if (rawXml == null) return; + if (strippedXml == null) return; RawXmlElement = rawXml; - StrippedXmlElement = strippedXml; + BaseElement = strippedXml; } + /// + /// When this constructor is used the BaseElement becomes equivalent to the strippedXml structure + /// + /// + /// + internal DynamicXml(string strippedXml, string rawXml) + { + if (rawXml == null) return; + if (strippedXml == null) return; + + RawXmlElement = XElement.Parse(rawXml); + BaseElement = XElement.Parse(strippedXml); + } + + /// + /// Constructor + /// + /// public DynamicXml(string xml) { if (xml.IsNullOrWhiteSpace()) return; var baseElement = XElement.Parse(xml); + + //same RawXmlElement = baseElement; - StrippedXmlElement = XElement.Parse( - XmlHelper.StripDashesInElementOrAttributeNames( - xml)); + BaseElement = baseElement; } + + /// + /// Constructor + /// + /// public DynamicXml(XPathNodeIterator xpni) { if (xpni == null) return; @@ -79,34 +100,34 @@ namespace Umbraco.Core.Dynamics //TODO: OuterXml is really bad for performance! Should actually use the XPathNodeIterator api var xml = xpni.Current.OuterXml; var baseElement = XElement.Parse(xml); + + //same RawXmlElement = baseElement; - StrippedXmlElement = XElement.Parse( - XmlHelper.StripDashesInElementOrAttributeNames( - xml)); + BaseElement = baseElement; } /// - /// Returns the InnertText based on the stripped xml element + /// Returns the InnertText based on the BaseElement object /// public string InnerText { get { - return StrippedXmlElement.Value; + return BaseElement.Value; } } /// - /// Returns the string representation of the dash-stripped xml element + /// Returns the string representation of the BaseElement object /// /// public string ToXml() { - return StrippedXmlElement.ToString(SaveOptions.DisableFormatting); + return BaseElement.ToString(SaveOptions.DisableFormatting); } /// - /// Returns the string representation of the raw (no dash stripping) xml element + /// Returns the string representation of the RawXmlElement object /// /// public string ToRawXml() @@ -122,7 +143,7 @@ namespace Umbraco.Core.Dynamics index = (int)indexes[0]; result = new DynamicXml( RawXmlElement.Elements().ElementAt(index), - StrippedXmlElement.Elements().ElementAt(index)); + BaseElement.Elements().ElementAt(index)); return true; } return base.TryGetIndex(binder, indexes, out result); @@ -131,12 +152,12 @@ namespace Umbraco.Core.Dynamics { if (args.Length == 0 && binder.Name == "ToXml") { - result = StrippedXmlElement.ToString(); + result = BaseElement.ToString(); return true; } if (args.Length == 1 && binder.Name == "XPath") { - var elements = StrippedXmlElement.XPathSelectElements(args[0].ToString()); + var elements = BaseElement.XPathSelectElements(args[0].ToString()); HandleIEnumerableXElement(elements, out result); return true; //anyway } @@ -171,7 +192,7 @@ namespace Umbraco.Core.Dynamics { result = ((IEnumerable) attempt.Result.ObjectResult).Select(x => new DynamicXml( x.RawXmlElement, - x.StrippedXmlElement)); + x.BaseElement)); } } } @@ -198,8 +219,8 @@ namespace Umbraco.Core.Dynamics return false; } - //First check for matching name including the 'cleaned' name (i.e. removal of hyphens, etc... ) - var elementByNameAttempt = CheckNodeNameMatch(binder.Name, RawXmlElement, true); + //Check if the name matches a node based on the BaseElement (which if the correct ctor is used, will be dash stripped) + var elementByNameAttempt = CheckNodeNameMatch(binder.Name, BaseElement); if (elementByNameAttempt.Success) { if (HandleIEnumerableXElement(elementByNameAttempt.Result, out result)) @@ -207,9 +228,9 @@ namespace Umbraco.Core.Dynamics return true; } } - - //Ok, so no elements matched, so lets try attributes - var attributeByNameAttempt = CheckAttributeNameMatch(binder.Name, RawXmlElement, true); + + //Check if the name matches a node based on the BaseElement (which if the correct ctor is used, will be dash stripped) + var attributeByNameAttempt = CheckAttributeNameMatch(binder.Name, BaseElement); if (attributeByNameAttempt.Success) { if (attributeByNameAttempt.Result.Count() > 1) @@ -229,7 +250,13 @@ namespace Umbraco.Core.Dynamics return base.TryGetMember(binder, out result); } - private Attempt> CheckAttributeNameMatch(string name, XElement xmlElement, bool checkCleanedName) + /// + /// Checks if the 'name' matches any attributes of xmlElement + /// + /// The name to match + /// The xml element to check against + /// + private static Attempt> CheckAttributeNameMatch(string name, XElement xmlElement) { var attributes = xmlElement.Attributes(name).Select(attr => attr.Value).ToArray(); if (attributes.Any()) @@ -246,16 +273,7 @@ namespace Umbraco.Core.Dynamics //we've found a match by the first child of an element called 'root' (strange, but sure) return new Attempt>(true, childElements); } - } - - if (checkCleanedName) - { - //still no match, we'll try to match with a 'cleaned' name - var cleanedXml = StrippedXmlElement; - - //pass false in to this as we don't want an infinite loop and clean the already cleaned xml - return CheckAttributeNameMatch(name, cleanedXml, false); - } + } //no deal return Attempt>.False; @@ -266,9 +284,8 @@ namespace Umbraco.Core.Dynamics /// /// The name to match /// The xml element to check against - /// If there are no matches, we'll clean the xml (i.e. remove hyphens, etc..) and then retry /// - private Attempt> CheckNodeNameMatch(string name, XElement xmlElement, bool checkCleanedName) + private Attempt> CheckNodeNameMatch(string name, XElement xmlElement) { //Go ahead and try to fetch all of the elements matching the member name, and wrap them var elements = xmlElement.Elements(name).ToArray(); @@ -290,15 +307,6 @@ namespace Umbraco.Core.Dynamics } } - if (checkCleanedName) - { - //still no match, we'll try to match with a 'cleaned' name - var cleanedXml = StrippedXmlElement; - - //pass false in to this as we don't want an infinite loop and clean the already cleaned xml - return CheckNodeNameMatch(name, cleanedXml, false); - } - //no deal return Attempt>.False; } @@ -336,23 +344,23 @@ namespace Umbraco.Core.Dynamics } /// - /// Executes an XPath expression over the dash-stripped Xml + /// Executes an XPath expression over the BaseElement object /// /// /// public DynamicXml XPath(string expression) { - var matched = StrippedXmlElement.XPathSelectElements(expression); + var matched = BaseElement.XPathSelectElements(expression); var root = new DynamicXml(""); foreach (var element in matched) { - root.StrippedXmlElement.Add(element); + root.BaseElement.Add(element); } return root; } /// - /// Return the string version of the dash-stripped Xml + /// Return the string version of the BaseElement object /// /// public override string ToString() @@ -366,23 +374,23 @@ namespace Umbraco.Core.Dynamics } public DynamicXml Find(string expression) { - return new DynamicXml(StrippedXmlElement.XPathSelectElements(expression).FirstOrDefault()); + return new DynamicXml(BaseElement.XPathSelectElements(expression).FirstOrDefault()); } public DynamicXml Find(string attributeName, object value) { string expression = string.Format("//*[{0}='{1}']", attributeName, value); - return new DynamicXml(StrippedXmlElement.XPathSelectElements(expression).FirstOrDefault()); + return new DynamicXml(BaseElement.XPathSelectElements(expression).FirstOrDefault()); } IEnumerator IEnumerable.GetEnumerator() { - return StrippedXmlElement.Elements().GetEnumerator(); + return BaseElement.Elements().GetEnumerator(); } public IEnumerator GetEnumerator() { - return StrippedXmlElement.Elements().Select(e => new DynamicXml(e)).GetEnumerator(); + return BaseElement.Elements().Select(e => new DynamicXml(e)).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() @@ -445,7 +453,7 @@ namespace Umbraco.Core.Dynamics } public bool IsPosition(int index) { - if (StrippedXmlElement == null || StrippedXmlElement.Parent == null) + if (BaseElement == null || BaseElement.Parent == null) { return false; } @@ -453,7 +461,7 @@ namespace Umbraco.Core.Dynamics } public HtmlString IsPosition(int index, string valueIfTrue) { - if (StrippedXmlElement == null || StrippedXmlElement.Parent == null) + if (BaseElement == null || BaseElement.Parent == null) { return new HtmlString(string.Empty); } @@ -461,7 +469,7 @@ namespace Umbraco.Core.Dynamics } public HtmlString IsPosition(int index, string valueIfTrue, string valueIfFalse) { - if (StrippedXmlElement == null || StrippedXmlElement.Parent == null) + if (BaseElement == null || BaseElement.Parent == null) { return new HtmlString(valueIfFalse); } @@ -469,7 +477,7 @@ namespace Umbraco.Core.Dynamics } public bool IsModZero(int modulus) { - if (StrippedXmlElement == null || StrippedXmlElement.Parent == null) + if (BaseElement == null || BaseElement.Parent == null) { return false; } @@ -477,7 +485,7 @@ namespace Umbraco.Core.Dynamics } public HtmlString IsModZero(int modulus, string valueIfTrue) { - if (StrippedXmlElement == null || StrippedXmlElement.Parent == null) + if (BaseElement == null || BaseElement.Parent == null) { return new HtmlString(string.Empty); } @@ -485,7 +493,7 @@ namespace Umbraco.Core.Dynamics } public HtmlString IsModZero(int modulus, string valueIfTrue, string valueIfFalse) { - if (StrippedXmlElement == null || StrippedXmlElement.Parent == null) + if (BaseElement == null || BaseElement.Parent == null) { return new HtmlString(valueIfFalse); } @@ -494,7 +502,7 @@ namespace Umbraco.Core.Dynamics public bool IsNotModZero(int modulus) { - if (StrippedXmlElement == null || StrippedXmlElement.Parent == null) + if (BaseElement == null || BaseElement.Parent == null) { return false; } @@ -502,7 +510,7 @@ namespace Umbraco.Core.Dynamics } public HtmlString IsNotModZero(int modulus, string valueIfTrue) { - if (StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (BaseElement == null || this.BaseElement.Parent == null) { return new HtmlString(string.Empty); } @@ -510,7 +518,7 @@ namespace Umbraco.Core.Dynamics } public HtmlString IsNotModZero(int modulus, string valueIfTrue, string valueIfFalse) { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return new HtmlString(valueIfFalse); } @@ -518,7 +526,7 @@ namespace Umbraco.Core.Dynamics } public bool IsNotPosition(int index) { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return false; } @@ -526,7 +534,7 @@ namespace Umbraco.Core.Dynamics } public HtmlString IsNotPosition(int index, string valueIfTrue) { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return new HtmlString(string.Empty); } @@ -534,7 +542,7 @@ namespace Umbraco.Core.Dynamics } public HtmlString IsNotPosition(int index, string valueIfTrue, string valueIfFalse) { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return new HtmlString(valueIfFalse); } @@ -542,56 +550,56 @@ namespace Umbraco.Core.Dynamics } public bool IsLast() { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return false; } - int count = this.StrippedXmlElement.Parent.Elements().Count(); + int count = this.BaseElement.Parent.Elements().Count(); return IsHelper(n => n.Index() == count - 1); } public HtmlString IsLast(string valueIfTrue) { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return new HtmlString(string.Empty); } - int count = this.StrippedXmlElement.Parent.Elements().Count(); + int count = this.BaseElement.Parent.Elements().Count(); return IsHelper(n => n.Index() == count - 1, valueIfTrue); } public HtmlString IsLast(string valueIfTrue, string valueIfFalse) { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return new HtmlString(valueIfFalse); } - int count = this.StrippedXmlElement.Parent.Elements().Count(); + int count = this.BaseElement.Parent.Elements().Count(); return IsHelper(n => n.Index() == count - 1, valueIfTrue, valueIfFalse); } public bool IsNotLast() { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return false; } - int count = this.StrippedXmlElement.Parent.Elements().Count(); + int count = this.BaseElement.Parent.Elements().Count(); return !IsHelper(n => n.Index() == count - 1); } public HtmlString IsNotLast(string valueIfTrue) { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return new HtmlString(string.Empty); } - int count = this.StrippedXmlElement.Parent.Elements().Count(); + int count = this.BaseElement.Parent.Elements().Count(); return IsHelper(n => n.Index() != count - 1, valueIfTrue); } public HtmlString IsNotLast(string valueIfTrue, string valueIfFalse) { - if (this.StrippedXmlElement == null || this.StrippedXmlElement.Parent == null) + if (this.BaseElement == null || this.BaseElement.Parent == null) { return new HtmlString(valueIfFalse); } - int count = this.StrippedXmlElement.Parent.Elements().Count(); + int count = this.BaseElement.Parent.Elements().Count(); return IsHelper(n => n.Index() != count - 1, valueIfTrue, valueIfFalse); } public bool IsEven() @@ -620,87 +628,87 @@ namespace Umbraco.Core.Dynamics } public bool IsEqual(DynamicXml other) { - return IsHelper(n => n.StrippedXmlElement == other.StrippedXmlElement); + return IsHelper(n => n.BaseElement == other.BaseElement); } public HtmlString IsEqual(DynamicXml other, string valueIfTrue) { - return IsHelper(n => n.StrippedXmlElement == other.StrippedXmlElement, valueIfTrue); + return IsHelper(n => n.BaseElement == other.BaseElement, valueIfTrue); } public HtmlString IsEqual(DynamicXml other, string valueIfTrue, string valueIfFalse) { - return IsHelper(n => n.StrippedXmlElement == other.StrippedXmlElement, valueIfTrue, valueIfFalse); + return IsHelper(n => n.BaseElement == other.BaseElement, valueIfTrue, valueIfFalse); } public bool IsNotEqual(DynamicXml other) { - return IsHelper(n => n.StrippedXmlElement != other.StrippedXmlElement); + return IsHelper(n => n.BaseElement != other.BaseElement); } public HtmlString IsNotEqual(DynamicXml other, string valueIfTrue) { - return IsHelper(n => n.StrippedXmlElement != other.StrippedXmlElement, valueIfTrue); + return IsHelper(n => n.BaseElement != other.BaseElement, valueIfTrue); } public HtmlString IsNotEqual(DynamicXml other, string valueIfTrue, string valueIfFalse) { - return IsHelper(n => n.StrippedXmlElement != other.StrippedXmlElement, valueIfTrue, valueIfFalse); + return IsHelper(n => n.BaseElement != other.BaseElement, valueIfTrue, valueIfFalse); } public bool IsDescendant(DynamicXml other) { var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.StrippedXmlElement == other.StrippedXmlElement) != null); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null); } public HtmlString IsDescendant(DynamicXml other, string valueIfTrue) { var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.StrippedXmlElement == other.StrippedXmlElement) != null, valueIfTrue); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsDescendant(DynamicXml other, string valueIfTrue, string valueIfFalse) { var ancestors = this.Ancestors(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.StrippedXmlElement == other.StrippedXmlElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public bool IsDescendantOrSelf(DynamicXml other) { var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.StrippedXmlElement == other.StrippedXmlElement) != null); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null); } public HtmlString IsDescendantOrSelf(DynamicXml other, string valueIfTrue) { var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.StrippedXmlElement == other.StrippedXmlElement) != null, valueIfTrue); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsDescendantOrSelf(DynamicXml other, string valueIfTrue, string valueIfFalse) { var ancestors = this.AncestorsOrSelf(); - return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.StrippedXmlElement == other.StrippedXmlElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => ancestors.FirstOrDefault(ancestor => ancestor.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public bool IsAncestor(DynamicXml other) { var descendants = this.Descendants(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.StrippedXmlElement == other.StrippedXmlElement) != null); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null); } public HtmlString IsAncestor(DynamicXml other, string valueIfTrue) { var descendants = this.Descendants(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.StrippedXmlElement == other.StrippedXmlElement) != null, valueIfTrue); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsAncestor(DynamicXml other, string valueIfTrue, string valueIfFalse) { var descendants = this.Descendants(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.StrippedXmlElement == other.StrippedXmlElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public bool IsAncestorOrSelf(DynamicXml other) { var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.StrippedXmlElement == other.StrippedXmlElement) != null); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null); } public HtmlString IsAncestorOrSelf(DynamicXml other, string valueIfTrue) { var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.StrippedXmlElement == other.StrippedXmlElement) != null, valueIfTrue); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue); } public HtmlString IsAncestorOrSelf(DynamicXml other, string valueIfTrue, string valueIfFalse) { var descendants = this.DescendantsOrSelf(); - return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.StrippedXmlElement == other.StrippedXmlElement) != null, valueIfTrue, valueIfFalse); + return IsHelper(n => descendants.FirstOrDefault(descendant => descendant.BaseElement == other.BaseElement) != null, valueIfTrue, valueIfFalse); } public IEnumerable Descendants() { @@ -708,7 +716,7 @@ namespace Umbraco.Core.Dynamics } public IEnumerable Descendants(Func func) { - var flattenedNodes = this.StrippedXmlElement.Elements().Map(func, n => n.Elements()); + var flattenedNodes = this.BaseElement.Elements().Map(func, n => n.Elements()); return flattenedNodes.ToList().ConvertAll(n => new DynamicXml(n)); } public IEnumerable DescendantsOrSelf() @@ -717,7 +725,7 @@ namespace Umbraco.Core.Dynamics } public IEnumerable DescendantsOrSelf(Func func) { - var flattenedNodes = this.StrippedXmlElement.Elements().Map(func, n => n.Elements()); + var flattenedNodes = this.BaseElement.Elements().Map(func, n => n.Elements()); var list = new List(); list.Add(this); list.AddRange(flattenedNodes.ToList().ConvertAll(n => new DynamicXml(n))); @@ -730,14 +738,14 @@ namespace Umbraco.Core.Dynamics public IEnumerable Ancestors(Func func) { var ancestorList = new List(); - var node = this.StrippedXmlElement; + var node = this.BaseElement; while (node != null) { if (node.Parent == null) break; XElement parent = node.Parent; if (parent != null) { - if (this.StrippedXmlElement != parent) + if (this.BaseElement != parent) { node = parent; if (func(node)) @@ -765,7 +773,7 @@ namespace Umbraco.Core.Dynamics public IEnumerable AncestorsOrSelf(Func func) { List ancestorList = new List(); - var node = this.StrippedXmlElement; + var node = this.BaseElement; ancestorList.Add(node); while (node != null) { @@ -773,7 +781,7 @@ namespace Umbraco.Core.Dynamics XElement parent = node.Parent; if (parent != null) { - if (this.StrippedXmlElement != parent) + if (this.BaseElement != parent) { node = parent; if (func(node)) @@ -797,13 +805,13 @@ namespace Umbraco.Core.Dynamics public int Index() { - if (this.StrippedXmlElement != null && this.StrippedXmlElement.Parent != null) + if (this.BaseElement != null && this.BaseElement.Parent != null) { - var elements = this.StrippedXmlElement.Parent.Elements(); + var elements = this.BaseElement.Parent.Elements(); int index = 0; foreach (var element in elements) { - if (element == this.StrippedXmlElement) break; + if (element == this.BaseElement) break; index++; } return index; diff --git a/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs b/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs index e021dc6852..f4ace38465 100644 --- a/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs +++ b/src/Umbraco.Core/Dynamics/DynamicXmlConverter.cs @@ -100,7 +100,7 @@ namespace Umbraco.Core.Dynamics //XElement if (TypeHelper.IsTypeAssignableFrom(destinationType)) { - return dxml.StrippedXmlElement; + return dxml.BaseElement; } //XmlElement if (TypeHelper.IsTypeAssignableFrom(destinationType)) diff --git a/src/Umbraco.Tests/PublishedContent/DynamicXmlConverterTests.cs b/src/Umbraco.Tests/PublishedContent/DynamicXmlConverterTests.cs index 4f0db5ee59..f0ad32a1bc 100644 --- a/src/Umbraco.Tests/PublishedContent/DynamicXmlConverterTests.cs +++ b/src/Umbraco.Tests/PublishedContent/DynamicXmlConverterTests.cs @@ -14,7 +14,9 @@ namespace Umbraco.Tests.PublishedContent public void Convert_To_Raw_String() { var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; - var dXml = new DynamicXml(xml); + var dXml = new DynamicXml( + XmlHelper.StripDashesInElementOrAttributeNames(xml), + xml); var result = dXml.TryConvertTo(); Assert.IsTrue(result.Success); Assert.AreEqual(xml, result.Result.Value); @@ -24,7 +26,9 @@ namespace Umbraco.Tests.PublishedContent public void Convert_To_Raw_XElement() { var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; - var dXml = new DynamicXml(xml); + var dXml = new DynamicXml( + XmlHelper.StripDashesInElementOrAttributeNames(xml), + xml); var result = dXml.TryConvertTo(); Assert.IsTrue(result.Success); Assert.AreEqual(xml, result.Result.Value.ToString(SaveOptions.DisableFormatting)); @@ -34,7 +38,9 @@ namespace Umbraco.Tests.PublishedContent public void Convert_To_Raw_XmlElement() { var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; - var dXml = new DynamicXml(xml); + var dXml = new DynamicXml( + XmlHelper.StripDashesInElementOrAttributeNames(xml), + xml); var result = dXml.TryConvertTo(); Assert.IsTrue(result.Success); Assert.AreEqual(xml, result.Result.Value.OuterXml); @@ -44,7 +50,9 @@ namespace Umbraco.Tests.PublishedContent public void Convert_To_Raw_XmlDocument() { var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; - var dXml = new DynamicXml(xml); + var dXml = new DynamicXml( + XmlHelper.StripDashesInElementOrAttributeNames(xml), + xml); var result = dXml.TryConvertTo(); Assert.IsTrue(result.Success); Assert.AreEqual(xml, result.Result.Value.InnerXml); @@ -55,10 +63,9 @@ namespace Umbraco.Tests.PublishedContent { var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; var dXml = new DynamicXml(xml); - var strippedXml = dXml.ToXml(); var result = dXml.TryConvertTo(); Assert.IsTrue(result.Success); - Assert.AreEqual(strippedXml, result.Result); + Assert.AreEqual(xml, result.Result); } [Test] @@ -66,10 +73,9 @@ namespace Umbraco.Tests.PublishedContent { var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; var dXml = new DynamicXml(xml); - var strippedXml = dXml.ToXml(); var result = dXml.TryConvertTo(); Assert.IsTrue(result.Success); - Assert.AreEqual(strippedXml, result.Result.ToString(SaveOptions.DisableFormatting)); + Assert.AreEqual(xml, result.Result.ToString(SaveOptions.DisableFormatting)); } [Test] @@ -77,10 +83,9 @@ namespace Umbraco.Tests.PublishedContent { var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; var dXml = new DynamicXml(xml); - var strippedXml = dXml.ToXml(); var result = dXml.TryConvertTo(); Assert.IsTrue(result.Success); - Assert.AreEqual(strippedXml, result.Result.OuterXml); + Assert.AreEqual(xml, result.Result.OuterXml); } [Test] @@ -88,10 +93,9 @@ namespace Umbraco.Tests.PublishedContent { var xml = "/media/54/tulips.jpg1024768620888jpg/media/41/hydrangeas.jpg1024768595284jpg"; var dXml = new DynamicXml(xml); - var strippedXml = dXml.ToXml(); var result = dXml.TryConvertTo(); Assert.IsTrue(result.Success); - Assert.AreEqual(strippedXml, result.Result.InnerXml); + Assert.AreEqual(xml, result.Result.InnerXml); } public override void TestSetup() diff --git a/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs b/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs index 66049bf2c6..642952e4aa 100644 --- a/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs +++ b/src/Umbraco.Tests/PublishedContent/DynamicXmlTests.cs @@ -2,6 +2,7 @@ using System; using System.Diagnostics; using Microsoft.CSharp.RuntimeBinder; using NUnit.Framework; +using Umbraco.Core; using Umbraco.Core.Dynamics; using System.Linq; @@ -27,7 +28,9 @@ namespace Umbraco.Tests.PublishedContent "; - var typedXml = new DynamicXml(xml); + var typedXml = new DynamicXml( + XmlHelper.StripDashesInElementOrAttributeNames(xml), + xml); dynamic dynamicXml = typedXml; var typedElement = typedXml.RawXmlElement.Element("url-picker"); @@ -65,7 +68,7 @@ namespace Umbraco.Tests.PublishedContent //we haven't explicitly defined ElementAt so this will dynamically invoke this method var element = dynamicXml.ElementAt(0); - Assert.AreEqual("1057", Enumerable.First(element.StrippedXmlElement.Elements()).Attribute("id").Value); + Assert.AreEqual("1057", Enumerable.First(element.BaseElement.Elements()).Attribute("id").Value); } [Test] @@ -96,8 +99,8 @@ namespace Umbraco.Tests.PublishedContent Assert.AreEqual(1, typedTaken.Count()); Assert.AreEqual(1, Enumerable.Count(dynamicTaken)); - Assert.AreEqual("1057", typedTaken.ElementAt(0).StrippedXmlElement.Elements().First().Attribute("id").Value); - Assert.AreEqual("1057", Enumerable.First(Enumerable.ElementAt(dynamicTaken, 0).StrippedXmlElement.Elements()).Attribute("id").Value); + Assert.AreEqual("1057", typedTaken.ElementAt(0).BaseElement.Elements().First().Attribute("id").Value); + Assert.AreEqual("1057", Enumerable.First(Enumerable.ElementAt(dynamicTaken, 0).BaseElement.Elements()).Attribute("id").Value); } [Test] diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/LegacyConverter.cs b/src/umbraco.MacroEngines/RazorDynamicNode/LegacyConverter.cs index 6c2daeb0de..6a68cf1a82 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/LegacyConverter.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/LegacyConverter.cs @@ -12,7 +12,7 @@ namespace umbraco.MacroEngines { if (result is Umbraco.Core.Dynamics.DynamicXml) { - result = new DynamicXml(((Umbraco.Core.Dynamics.DynamicXml)result).StrippedXmlElement); + result = new DynamicXml(((Umbraco.Core.Dynamics.DynamicXml)result).BaseElement); } else if (result is Umbraco.Core.Dynamics.DynamicNull) {