diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs
index 1ed91eb59a..e2b81de74e 100644
--- a/src/Umbraco.Core/Models/ContentExtensions.cs
+++ b/src/Umbraco.Core/Models/ContentExtensions.cs
@@ -392,8 +392,7 @@ namespace Umbraco.Core.Models
public static XElement ToXml(this IContent content)
{
//nodeName should match Casing.SafeAliasWithForcingCheck(content.ContentType.Alias);
- //var nodeName = content.ContentType.Alias.ToUmbracoAlias(StringAliasCaseType.CamelCase, true);
- var nodeName = content.ContentType.Alias;
+ var nodeName = UmbracoSettings.UseLegacyXmlSchema ? "node" : content.ContentType.Alias.ToSafeAliasWithForcingCheck();
var niceUrl = content.Name.FormatUrl().ToLower();
var xml = new XElement(nodeName,
@@ -412,7 +411,8 @@ namespace Umbraco.Core.Models
new XAttribute("writerName", content.GetWriterProfile().Name),
new XAttribute("creatorName", content.GetCreatorProfile().Name),
new XAttribute("path", content.Path),
- new XAttribute("isDoc", ""));
+ new XAttribute("isDoc", ""),
+ UmbracoSettings.UseLegacyXmlSchema ? new XAttribute("nodeTypeAlias", content.ContentType.Alias) : null);
foreach (var property in content.Properties)
{
diff --git a/src/Umbraco.Core/Models/PropertyExtensions.cs b/src/Umbraco.Core/Models/PropertyExtensions.cs
index 0f3a40fe07..c4568e8472 100644
--- a/src/Umbraco.Core/Models/PropertyExtensions.cs
+++ b/src/Umbraco.Core/Models/PropertyExtensions.cs
@@ -1,6 +1,7 @@
using System;
using System.Xml;
using System.Xml.Linq;
+using Umbraco.Core.Configuration;
namespace Umbraco.Core.Models
{
@@ -13,7 +14,7 @@ namespace Umbraco.Core.Models
/// Xml of the property and its value
public static XElement ToXml(this Property property)
{
- string nodeName = property.Alias.ToUmbracoAlias(StringAliasCaseType.CamelCase, true);
+ string nodeName = UmbracoSettings.UseLegacyXmlSchema ? "data" : property.Alias.ToSafeAlias();
var xd = new XmlDocument();
XmlNode xmlNode = xd.CreateNode(XmlNodeType.Element, nodeName, "");
diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs
index 2ad3b927fc..40f8648165 100644
--- a/src/Umbraco.Core/StringExtensions.cs
+++ b/src/Umbraco.Core/StringExtensions.cs
@@ -771,5 +771,54 @@ namespace Umbraco.Core
return newUrl;
}
+
+ ///
+ /// An extention method to ensure that an Alias string doesn't contains any illegal characters
+ /// which is defined in a private constant 'ValidCharacters' in this class.
+ /// Conventions over configuration, baby. You can't touch this - MC Hammer!
+ ///
+ ///
+ /// Copied and cleaned up a bit from umbraco.cms.helpers.Casing.
+ ///
+ /// The alias.
+ /// An alias guaranteed not to contain illegal characters
+ public static string ToSafeAlias(this string alias)
+ {
+ const string validAliasCharacters = "_-abcdefghijklmnopqrstuvwxyz1234567890";
+ const string invalidFirstCharacters = "01234567890";
+ var safeString = new StringBuilder();
+ int aliasLength = alias.Length;
+ for (int i = 0; i < aliasLength; i++)
+ {
+ string currentChar = alias.Substring(i, 1);
+ if (validAliasCharacters.Contains(currentChar.ToLower()))
+ {
+ // check for camel (if previous character is a space, we'll upper case the current one
+ if (safeString.Length == 0 && invalidFirstCharacters.Contains(currentChar.ToLower()))
+ {
+ currentChar = "";
+ }
+ else
+ {
+ if (i < aliasLength - 1 && i > 0 && alias.Substring(i - 1, 1) == " ")
+ currentChar = currentChar.ToUpper();
+
+ safeString.Append(currentChar);
+ }
+ }
+ }
+
+ return safeString.ToString();
+ }
+
+ public static string ToSafeAliasWithForcingCheck(this string alias)
+ {
+ if (UmbracoSettings.ForceSafeAliases)
+ {
+ return alias.ToSafeAlias();
+ }
+
+ return alias;
+ }
}
}
diff --git a/src/Umbraco.Tests/Models/ContentXmlTest.cs b/src/Umbraco.Tests/Models/ContentXmlTest.cs
index 343dc0be9b..d080e037b6 100644
--- a/src/Umbraco.Tests/Models/ContentXmlTest.cs
+++ b/src/Umbraco.Tests/Models/ContentXmlTest.cs
@@ -53,7 +53,7 @@ namespace Umbraco.Tests.Models
var content = MockedContent.CreateTextpageContent(contentType, "Root Home", -1);
ServiceContext.ContentService.Save(content, 0);
- var nodeName = content.ContentType.Alias.ToUmbracoAlias(StringAliasCaseType.CamelCase, true);
+ var nodeName = content.ContentType.Alias.ToSafeAliasWithForcingCheck();
// Act
XElement element = content.ToXml();