Importing blog posts and comments into nested content nodes
I'm creating a package for Umbraco to export and import blogs, I have most of the code working however the nesting on import isn't really working how I want it to.
this is the code I have
using uBlogsyUmbracoExport.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Umbraco.Core.Persistence;
using Umbraco.Web;
using Umbraco.Web.WebApi;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
using umbraco.NodeFactory;
using AutoMapper.Internal;
using System.Configuration;
using System.Xml.Linq;
using System.Xml;
namespace UmbracoBlogsExportPackage.App_Code
{
public class ImportAllBlogsController : UmbracoAuthorizedApiController
{
public string basePath;
public void LocatePath()
{
this.basePath = System.Web.Hosting.HostingEnvironment.MapPath(@"/upload");
}
[System.Web.Http.HttpPost]
public void ImportAll()
{
// Get HttpContext
var myContext = Request.TryGetHttpContext();
if (myContext.Success)
{
// Fetch File from Angular Interface
HttpPostedFileBase myFile = myContext.Result.Request.Files["file"];
//Check if file is valid
if (myFile == null)
{
throw new HttpException("invalid file");
}
else
{
// parse the document and sort contents into list
XDocument xdoc1 = XDocument.Load(myFile.InputStream);
BlogPosts objBlogPosts = new BlogPosts();
BlogComment objBlogComments = new BlogComment();
List<BlogPosts> lstblogs
= (from _blog in xdoc1.Element("BlogPosts").Elements("Blog")
select new BlogPosts
{
Title = _blog.Element("Title").Value,
BodyText = _blog.Element("BodyText").Value,
PublishDate = _blog.Element("PublishDate").Value,
Author = _blog.Element("Author").Value
}).ToList();
List<BlogComment> lstComments
= (from _comm in xdoc1.Element("BlogPosts").Elements("Blog").Elements("Comments")
select new BlogComment
{
Author = _comm.Element("Author").Value,
Comment = _comm.Element("Comment").Value
}).ToList();
//use ContentService API to create a document for the item
var contentService = UmbracoContext.Current.Application.Services.ContentService;
var blogNode = Umbraco.TypedContent(1136);
foreach (var post in lstblogs)
{
// Create a document with a title, parentNodeId, node, and userI
var newBlog = contentService.CreateContent(post.Title, 1137, "umbNewsItem", 0);
if (newBlog != null)
{
// Set values for the document
newBlog.SetValue("title", post.Title.ToNullSafeString());
newBlog.SetValue("bodyText", post.BodyText.ToNullSafeString());
newBlog.SetValue("publishDate", post.PublishDate.ToNullSafeString());
newBlog.SetValue("author", post.Author.ToNullSafeString());
newBlog.SetValue("image", post.Image);
}
// Check if content is null, if so throw exception
if (newBlog == null)
{
throw new Exception("newBlog is null.");
}
// Check if contentService is null, if so throw exception
if (contentService == null)
{
throw new Exception("contentService is null.");
}
// Check if contentService is specified
if(contentService != null)
{
// Save and publish content
contentService.SaveAndPublish(newBlog, 0, true);
}
var parentId = newBlog.Id;
var newCommentSection = contentService.CreateContent("Comments", parentId, "comments", 0);
contentService.SaveAndPublish(newCommentSection, 0, true);
foreach (var comm in lstComments)
{
var commentsId = newCommentSection.Id;
var newComment = contentService.CreateContent("Comment", commentsId, "comment", 0);
if (newComment != null)
{
newComment.SetValue("comment", comm.Comment.ToNullSafeString());
newComment.SetValue("author", comm.Author.ToNullSafeString());
}
contentService.SaveAndPublish(newComment, 0, true);
}
}
}
}
}
}
}
What it's doing is creating the post with the comments, however when there's more than one post, it's adding all the comments to each post. What I want is to add the comments relevant to the individual post on each post.
here is my xml example:
<BlogPosts>
<Blog>
<Title>This is a new amazing blog title</Title>
<BodyText><p>This is more new Random Content</p></BodyText>
<PublishDate>29/09/2036 15:49:47</PublishDate>
<Author>0</Author>
<Comments>
<Author>Genevive La Crosse</Author>
<Comment><p>This is a comment</p></Comment>
</Comments>
<Comments>
<Author>Gilliandro Du Mere</Author>
<Comment><p>This is a comment</p></Comment>
</Comments>
</Blog>
<Blog>
<Title>This is another new amazing blog title</Title>
<BodyText><p>This is more new Random Content</p></BodyText>
<PublishDate>29/09/2036 15:49:47</PublishDate>
<Author>0</Author>
<Comments>
<Author>Gerome Littlewood</Author>
<Comment><p>This is a comment</p></Comment>
</Comments>
<Comments>
<Author>Tatiana Du Mere</Author>
<Comment><p>This is a comment</p></Comment>
</Comments>
</Blog>
</BlogPosts>
Importing blog posts and comments into nested content nodes
I'm creating a package for Umbraco to export and import blogs, I have most of the code working however the nesting on import isn't really working how I want it to.
this is the code I have
What it's doing is creating the post with the comments, however when there's more than one post, it's adding all the comments to each post. What I want is to add the comments relevant to the individual post on each post.
here is my xml example:
thanks in advance!
Hi Jonathan,
Did you solve your issue?
Thanks,
Alex
is working on a reply...