I am trying to port an older site to 4.5 and ran into this rather suspicious error with one of my custom trees. I am trying to use a custom members tree instead of showing the a,b,c,d....folder structure and use my own editing features as member properties live in a custom DB.
So, I simply pointed umbracoAppTree member to my new assemply and handler (like in the 'old' app). When I load the tree my Members node shows up but when I try to expand the node, I get the follwing exception:
<html>
<head>
<title>Data at the root level is invalid. Line 1, position 1.</title>
<style>
body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}
p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
pre {font-family:"Lucida Console";font-size: .9em}
.marker {font-weight: bold; color: black;text-decoration: none;}
.version {color: gray;}
.error {margin-bottom: 10px;}
.expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
</style>
</head>
<body bgcolor="white">
<span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>
<h2> <i>Data at the root level is invalid. Line 1, position 1.</i> </h2></span>
<font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
<b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
<br><br>
<b> Exception Details: </b>System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.<br><br>
<b>Source Error:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code><pre>
Line 87: {
Line 88: XmlDocument xDoc = new XmlDocument();
<font color=red>Line 89: xDoc.LoadXml(tree.ToString());
</font>Line 90: Render(ref xDoc);
Line 91: tree = SerializableData.Deserialize(xDoc.OuterXml, typeof (XmlTree)) as XmlTree;</pre></code>
</td>
</tr>
</table>
<br>
<b> Source File: </b> E:\Code\My Dropbox\Code\Scandia SVN\Scandia.Sites.LongbowCap.com\Trees\loadMembers.cs<b> Line: </b> 89
<br><br>
<b>Stack Trace:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code><pre>
[XmlException: Data at the root level is invalid. Line 1, position 1.]
System.Xml.XmlTextReaderImpl.Throw(Exception e) +73
System.Xml.XmlTextReaderImpl.Throw(String res, String arg) +122
System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() +4076201
System.Xml.XmlTextReaderImpl.ParseDocumentContent() +189
System.Xml.XmlTextReaderImpl.Read() +145
System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) +114
System.Xml.XmlDocument.Load(XmlReader reader) +114
System.Xml.XmlDocument.LoadXml(String xml) +168
Scandia.Sites.LongbowCap.com.LoadMembers.Render(XmlTree& tree) in E:\Code\My Dropbox\Code\Scandia SVN\Scandia.Sites.LongbowCap.com\Trees\loadMembers.cs:89
umbraco.presentation.webservices.TreeDataService.LoadTree(TreeRequestParams treeParams) +157
umbraco.presentation.webservices.TreeDataService.GetXmlTree() +198
umbraco.presentation.webservices.TreeDataService.ProcessRequest(HttpContext context) +85
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +100
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
</pre></code>
</td>
</tr>
</table>
<br>
<hr width=100% size=1 color=silver>
<b>Version Information:</b> Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1
</font>
</body>
</html>
<!--
[XmlException]: Data at the root level is invalid. Line 1, position 1.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
at System.Xml.XmlDocument.Load(XmlReader reader)
at System.Xml.XmlDocument.LoadXml(String xml)
at Scandia.Sites.LongbowCap.com.LoadMembers.Render(XmlTree& tree) in E:\Code\My Dropbox\Code\Scandia SVN\Scandia.Sites.LongbowCap.com\Trees\loadMembers.cs:line 89
at umbraco.presentation.webservices.TreeDataService.LoadTree(TreeRequestParams treeParams)
at umbraco.presentation.webservices.TreeDataService.GetXmlTree()
at umbraco.presentation.webservices.TreeDataService.ProcessRequest(HttpContext context)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
I'm sure it's some commonly known issue between compatibility, but I've been out of the look for a bit. Here's what the tree looks like:
/// <summary>
/// Handles loading of the member application into the application tree
/// </summary>
public class LoadMembers : BaseTree
{
public LoadMembers(string application) : base(application)
{
}
protected override void CreateRootNode(ref XmlTreeNode rootNode)
{
rootNode.Icon = FolderIcon;
rootNode.OpenIcon = FolderIconOpen;
rootNode.NodeType = "init" + TreeAlias;
rootNode.NodeID = "init";
}
/// <summary>
/// Renders the Javascript.
/// </summary>
/// <param name="Javascript">The javascript.</param>
public override void RenderJS(ref StringBuilder Javascript)
{
Javascript.Append(
@"
function openMember(id) {
parent.right.document.location.href = 'members/editMember.aspx?id=' + id;
}
function searchMembers(id) {
parent.right.document.location.href = 'members/SearchMembers.aspx';
}
function viewMembers(letter) {
parent.right.document.location.href = 'members/viewMembers.aspx?letter=' + letter;
}
function openContentItem(id) {
parent.right.document.location.href = 'ContentItem/edit.aspx?id=' + id;
}
function openMemberExport() {
parent.right.document.location.href = 'members/MemberExport.aspx';
}
function openRecruiterList() {
parent.right.document.location.href = 'members/Recruiters.aspx';
}
function openCompanyList() {
parent.right.document.location.href = 'members/Companies.aspx';
}
function openSendNewsletter() {
parent.right.document.location.href = 'members/SendNewsletter.aspx';
}
function openDownloadResumes() {
parent.right.document.location.href = 'members/DownloadResumes.aspx';
}
");
}
/// <summary>
/// This will call the normal Render method by passing the converted XmlTree to an XmlDocument.
/// TODO: need to update this render method to do everything that the obsolete render method does and remove the obsolete method
/// </summary>
/// <param name="tree"></param>
public override void Render(ref XmlTree tree)
{
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(tree.ToString());
Render(ref xDoc);
tree = SerializableData.Deserialize(xDoc.OuterXml, typeof (XmlTree)) as XmlTree;
}
/// <summary>
/// Renders the specified tree item.
/// </summary>
/// <param name="Tree">The tree.</param>
public override void Render(ref XmlDocument Tree)
{
string letter = "";
string ContentItemParent = "";
if (HttpContext.Current.Request.QueryString.ToString().IndexOf("letter") >= 0)
{
letter = HttpContext.Current.Request.QueryString.Get("letter");
}
if (HttpContext.Current.Request.QueryString.ToString().IndexOf("ContentItemParent") >= 0)
{
ContentItemParent = HttpContext.Current.Request.QueryString.Get("ContentItemParent");
}
// letter = ;
XmlNode root = Tree.DocumentElement;
if (letter != "")
{
}
else
{
// Search Member
XmlElement treeElementSearch = Tree.CreateElement("tree");
treeElementSearch.SetAttribute("menu", "");
treeElementSearch.SetAttribute("nodeID", "Search");
treeElementSearch.SetAttribute("text", ui.Text("search"));
treeElementSearch.SetAttribute("action", "javascript:searchMembers();");
treeElementSearch.SetAttribute("src", "");
treeElementSearch.SetAttribute("icon", FolderIcon);
treeElementSearch.SetAttribute("openIcon", FolderIcon);
treeElementSearch.SetAttribute("nodeType", "member");
root.AppendChild(treeElementSearch);
// Recruiter List
XmlElement treeElementRecruiterList = Tree.CreateElement("tree");
treeElementRecruiterList.SetAttribute("menu", "");
treeElementRecruiterList.SetAttribute("nodeID", "RecruiterList");
treeElementRecruiterList.SetAttribute("text", ui.Text("RecruiterList"));
treeElementRecruiterList.SetAttribute("action", "javascript:openRecruiterList();");
treeElementRecruiterList.SetAttribute("src", "");
treeElementRecruiterList.SetAttribute("icon", FolderIcon);
treeElementRecruiterList.SetAttribute("openIcon", FolderIcon);
treeElementRecruiterList.SetAttribute("nodeType", "member");
root.AppendChild(treeElementRecruiterList);
// Company List
XmlElement treeElementCompanyList = Tree.CreateElement("tree");
treeElementCompanyList.SetAttribute("menu", "");
treeElementCompanyList.SetAttribute("nodeID", "CompanyList");
treeElementCompanyList.SetAttribute("text", ui.Text("CompanyList"));
treeElementCompanyList.SetAttribute("action", "javascript:openCompanyList();");
treeElementCompanyList.SetAttribute("src", "");
treeElementCompanyList.SetAttribute("icon", FolderIcon);
treeElementCompanyList.SetAttribute("openIcon", FolderIcon);
treeElementCompanyList.SetAttribute("nodeType", "member");
root.AppendChild(treeElementCompanyList);
// Send newsletter via Emails
XmlElement treeElementSendEmails = Tree.CreateElement("tree");
treeElementSendEmails.SetAttribute("menu", "");
treeElementSendEmails.SetAttribute("nodeID", "Send Newsletter Via Email");
treeElementSendEmails.SetAttribute("text", ui.Text("sendemails"));
treeElementSendEmails.SetAttribute("action", "javascript:openSendNewsletter();");
treeElementSendEmails.SetAttribute("src", "");
treeElementSendEmails.SetAttribute("icon", FolderIcon);
treeElementSendEmails.SetAttribute("openIcon", FolderIcon);
treeElementSendEmails.SetAttribute("nodeType", "member");
root.AppendChild(treeElementSendEmails);
// Export Emails
XmlElement treeElementExportEmails = Tree.CreateElement("tree");
treeElementExportEmails.SetAttribute("menu", "");
treeElementExportEmails.SetAttribute("nodeID", "Export Email Addresses");
treeElementExportEmails.SetAttribute("text", ui.Text("exportemails"));
treeElementExportEmails.SetAttribute("action", "javascript:openMemberExport();");
treeElementExportEmails.SetAttribute("src", "");
treeElementExportEmails.SetAttribute("icon", FolderIcon);
treeElementExportEmails.SetAttribute("openIcon", FolderIcon);
treeElementExportEmails.SetAttribute("nodeType", "member");
root.AppendChild(treeElementExportEmails);
// Download Resumes
XmlElement treeElementDownloadResumes = Tree.CreateElement("tree");
treeElementDownloadResumes.SetAttribute("menu", "");
treeElementDownloadResumes.SetAttribute("nodeID", "Download Resumes");
treeElementDownloadResumes.SetAttribute("text", ui.Text("downloadresumes"));
treeElementDownloadResumes.SetAttribute("action", "javascript:openDownloadResumes();");
treeElementDownloadResumes.SetAttribute("src", "");
treeElementDownloadResumes.SetAttribute("icon", FolderIcon);
treeElementDownloadResumes.SetAttribute("openIcon", FolderIcon);
treeElementDownloadResumes.SetAttribute("nodeType", "member");
root.AppendChild(treeElementDownloadResumes);
}
}
}
I've stumblled across what I think is the same issue. Did you manage to find a solution? My tree is not throwing an exception, but if I try to expand my custom tree, it is empty.
If I try and debug my by class that overrides basetree, breakpoints don't get hit.
Hi Deano, the above is simply depracated code and was introduced (I think) in v3. I inherited a site that was built with the code and never even thought about it. The new syntax should be more along the lines of this:
Thanks for that. Turns out my class that builds the tree was under a sub namespace. I'm not saying that correctly probably, but what I mean is that it wasn't assembly.class, it was assyembly.folder.folder.class.
That broke it. I just took the class out of that namespace and it worked again.
The tree rendering is different between 4.0 and 4.5. 4.0 expects that you use inline javascript and 4.5 wants you to use javascript functions. I wrote a blogpost on this subject a while back how to support both 4.0 and 4.5 in your package.
Thanks for chiming in RIchard. In this case (my orignal issue wich has long been solved), I was using the wrong tree implementation all together. I did catch your post on the JS compat issues which is a nice resource.
Custom tree worked in 4.0.x but not in 4.5
Hi all,
I am trying to port an older site to 4.5 and ran into this rather suspicious error with one of my custom trees. I am trying to use a custom members tree instead of showing the a,b,c,d....folder structure and use my own editing features as member properties live in a custom DB.
So, I simply pointed umbracoAppTree member to my new assemply and handler (like in the 'old' app). When I load the tree my Members node shows up but when I try to expand the node, I get the follwing exception:
I'm sure it's some commonly known issue between compatibility, but I've been out of the look for a bit. Here's what the tree looks like:
Thanks,
Nik
Hello,
I've stumblled across what I think is the same issue. Did you manage to find a solution? My tree is not throwing an exception, but if I try to expand my custom tree, it is empty.
If I try and debug my by class that overrides basetree, breakpoints don't get hit.
I have not changed anything from my 4.0 v.
Cheers
Deano
Hi Deano, the above is simply depracated code and was introduced (I think) in v3. I inherited a site that was built with the code and never even thought about it. The new syntax should be more along the lines of this:
Hope this helps.
-- Nik
Hey Nik,
Thanks for that. Turns out my class that builds the tree was under a sub namespace. I'm not saying that correctly probably, but what I mean is that it wasn't assembly.class, it was assyembly.folder.folder.class.
That broke it. I just took the class out of that namespace and it worked again.
Cheers
The tree rendering is different between 4.0 and 4.5. 4.0 expects that you use inline javascript and 4.5 wants you to use javascript functions. I wrote a blogpost on this subject a while back how to support both 4.0 and 4.5 in your package.
Cheers,
Richard
Thanks for chiming in RIchard. In this case (my orignal issue wich has long been solved), I was using the wrong tree implementation all together. I did catch your post on the JS compat issues which is a nice resource.
Cheers!
-- Nik
is working on a reply...