private void LoadFromXmlDocument()
        {
            var doc = new XmlDocument();

            doc.Load(XmlReader);

            var posts = doc.GetElementsByTagName("post");

            foreach (XmlNode post in posts)
            {
                var blogX = new BlogMlExtendedPost();

                if (post.Attributes != null)
                {
                    blogX.PostUrl = GetAttributeValue <string>(post.Attributes["post-url"]);
                }

                if (post.ChildNodes.Count <= 0)
                {
                    blogsExtended.Add(blogX);
                    continue;
                }

                foreach (XmlNode child in post.ChildNodes)
                {
                    if (child.Name == "tags")
                    {
                        foreach (XmlNode tag in child.ChildNodes)
                        {
                            if (tag.Attributes != null)
                            {
                                if (blogX.Tags == null)
                                {
                                    blogX.Tags = new List <string>();
                                }

                                blogX.Tags.Add(GetAttributeValue <string>(tag.Attributes["ref"]));
                            }
                        }
                    }

                    if (child.Name == "comments")
                    {
                        LoadBlogComments(blogX, child);
                    }

                    if (child.Name == "trackbacks")
                    {
                        LoadBlogTrackbacks(blogX, child);
                    }
                }

                blogsExtended.Add(blogX);
            }
        }
        private async Task ImportCommentAsync(BlogMlExtendedPost extPost, Post post)
        {
            if (extPost.Comments?.Any() == true)
            {
                foreach (var extComment in extPost.Comments)
                {
                    var comment = new Comment()
                    {
                        Author               = extComment.Author,
                        Content              = extComment.Content,
                        CreationTime         = extComment.CreationTime,
                        Email                = extComment.Email,
                        IP                   = extComment.IP,
                        IsApproved           = extComment.IsApproved,
                        IsDeleted            = extComment.IsDeleted,
                        IsSpam               = extComment.IsSpam,
                        LastModificationTime = extComment.LastModificationTime,
                        ParentId             = extComment.ParentId,
                        Website              = extComment.Author,
                    };

                    // valiate
                    if (comment.Author?.Length >= 32)
                    {
                        comment.Author = comment.Author.Substring(0, 32);
                    }
                    if (comment.Email?.Length >= 128)
                    {
                        comment.Email = comment.Email.Substring(0, 128);
                    }

                    comment.PostId  = post.Id;
                    comment.Country = await _iPAddressService.GetIPLocationAsync(comment.IP);

                    if (!string.IsNullOrWhiteSpace(extComment.ParentCommentId))
                    {
                        comment.ParentId = GetOrAddId("command", extComment.ParentCommentId, comment.Id);
                    }

                    await _commentService.InsertAsync(comment);

                    GetOrAddId("command", extComment.CommentId, comment.Id);
                }

                post.CommentsCount = extPost.Comments.Count;

                CommentCount += post.CommentsCount;

                await _postService.UpdateAsync(post);
            }
        }
        private async Task <bool> ImportPageAsync(BlogMlExtendedPost extPost)
        {
            var p = new Page
            {
                Title                = extPost.BlogPost.Title,
                CreationTime         = extPost.BlogPost.DateCreated,
                LastModificationTime = extPost.BlogPost.DateModified,
                Content              = extPost.BlogPost.Content.UncodedText,
                Description          = extPost.BlogPost.Excerpt.UncodedText,
                Published            = extPost.BlogPost.Approved,
                DisplayOrder         = 1,
            };

            if (!string.IsNullOrEmpty(extPost.PostUrl))
            {
                // looking for a Slug with patterns such as:
                //    /some-slug.aspx
                //    /some-slug.html
                //    /some-slug
                //
                Match slugMatch = Regex.Match(extPost.PostUrl, @"/([^/\.]+)(?:$|\.[\w]{1,10}$)", RegexOptions.IgnoreCase);
                if (slugMatch.Success)
                {
                    p.Slug = slugMatch.Groups[1].Value.Trim();
                }
            }

            if (string.IsNullOrEmpty(p.Slug))
            {
                p.Slug = await _slugService.NormalarAsync(p.Title);
            }

            // skip if exists
            if (await _pageService.FindBySlugAsync(p.Slug) != null)
            {
                return(false);
            }

            await _pageService.InsertAsync(p);

            return(true);
        }
        private void LoadBlogComments(BlogMlExtendedPost blogX, XmlNode child)
        {
            foreach (XmlNode com in child.ChildNodes)
            {
                if (com.Attributes != null)
                {
                    var c = new ExtendedComment
                    {
                        CommentId    = GetAttributeValue <string>(com.Attributes["id"]),
                        Author       = GetAttributeValue <string>(com.Attributes["user-name"]),
                        Email        = GetAttributeValue <string>(com.Attributes["user-email"]),
                        IP           = GetAttributeValue <string>(com.Attributes["user-ip"]),
                        CreationTime = GetDate(com.Attributes["date-created"]),
                        Content      = "",
                        Website      = GetAttributeValue <string>(com, "user-url"),
                    };

                    var parentid = GetAttributeValue <string>(com.Attributes["parentid"]);
                    if (!string.IsNullOrEmpty(parentid))
                    {
                        c.ParentCommentId = parentid;
                    }

                    c.IsApproved = GetAttributeValue <bool>(com.Attributes["approved"]);

                    foreach (XmlNode comNode in com.ChildNodes)
                    {
                        if (comNode.Name == "content")
                        {
                            c.Content = comNode.InnerText;
                        }
                    }

                    if (blogX.Comments == null)
                    {
                        blogX.Comments = new List <ExtendedComment>();
                    }

                    blogX.Comments.Add(c);
                }
            }
        }
        private void LoadBlogTrackbacks(BlogMlExtendedPost blogX, XmlNode child)
        {
            foreach (XmlNode com in child.ChildNodes)
            {
                if (com.Attributes != null)
                {
                    var c = new ExtendedComment
                    {
                        IP           = "127.0.0.1",
                        IsApproved   = GetAttributeValue <bool>(com.Attributes["approved"]),
                        CreationTime = GetDate(com.Attributes["date-created"])
                    };

                    if (!string.IsNullOrEmpty(GetAttributeValue <string>(com.Attributes["url"])))
                    {
                        c.Website = (GetAttributeValue <string>(com.Attributes["url"]));
                    }

                    foreach (XmlNode comNode in com.ChildNodes)
                    {
                        if (comNode.Name == "title")
                        {
                            c.Content = comNode.InnerText;
                        }
                    }

                    c.Email  = c.Content.Contains("pingback", StringComparison.InvariantCultureIgnoreCase) ? "pingback" : "trackback";
                    c.Author = c.Email;

                    if (blogX.Comments == null)
                    {
                        blogX.Comments = new List <ExtendedComment>();
                    }

                    blogX.Comments.Add(c);
                }
            }
        }
        private async Task <bool> ImportPostAsync(BlogMlExtendedPost extPost)
        {
            var p = new Post
            {
                Title                = extPost.BlogPost.Title,
                CreationTime         = extPost.BlogPost.DateCreated,
                PublishedTime        = extPost.BlogPost.DateCreated,
                LastModificationTime = extPost.BlogPost.DateModified,
                Content              = extPost.BlogPost.Content.UncodedText,
                Description          = extPost.BlogPost.Excerpt.UncodedText,
                IsDraft              = !extPost.BlogPost.Approved,
                ViewsCount           = GetValue(extPost.BlogPost.Views),
                UserId               = _user.Id,
                EnableComment        = true,
            };

            if (extPost.BlogPost.HasExcerpt)
            {
                p.Description = extPost.BlogPost.Excerpt.UncodedText;
            }

            if (!string.IsNullOrEmpty(extPost.PostUrl))
            {
                // looking for a Slug with patterns such as:
                //    /some-slug.aspx
                //    /some-slug.html
                //    /some-slug
                //
                Match slugMatch = Regex.Match(extPost.PostUrl, @"/([^/\.]+)(?:$|\.[\w]{1,10}$)", RegexOptions.IgnoreCase);
                if (slugMatch.Success)
                {
                    p.Slug = slugMatch.Groups[1].Value.Trim();
                }
            }

            if (string.IsNullOrEmpty(p.Slug))
            {
                p.Slug = await _slugService.NormalarAsync(p.Title);
            }

            // skip if exists
            if (await _postService.FindBySlugAsync(p.Slug) != null)
            {
                return(false);
            }

            if (extPost.Categories != null && extPost.Categories.Count > 0)
            {
                foreach (var item in extPost.Categories)
                {
                    p.Categories.Add(new PostCategory()
                    {
                        CategoryId = item.Id,
                    });
                }
            }


            if (extPost.Tags != null && extPost.Tags.Count > 0)
            {
                foreach (var tagName in extPost.Tags)
                {
                    var tag = await _tagsService.GetOrCreateAsync(tagName);

                    p.Tags.Add(new PostTags()
                    {
                        TagsId = tag.Id
                    });
                }
            }

            if (await _postService.FindBySlugAsync(p.Slug) != null)
            {
                return(false);
            }

            await _postService.InsertAsync(p);

            await ImportCommentAsync(extPost, p);

            return(true);
        }
        private async Task ImportPostsAsync(BlogMLBlog blog)
        {
            _logger.LogInformation("Start importing posts...");

            foreach (var post in blog.Posts)
            {
                BlogMLPost p = post;

                blogsExtended.Where(b => b.PostUrl == p.PostUrl).FirstOrDefault().BlogPost = post;
            }

            var allPost = blogsExtended.OrderBy(t => t.BlogPost.DateCreated).ToList();

            foreach (BlogMlExtendedPost extPost in allPost)
            {
                if (extPost.BlogPost.PostType == BlogPostTypes.Normal)
                {
                    try
                    {
                        BlogMlExtendedPost post = extPost;

                        if (extPost.BlogPost.Categories.Count > 0)
                        {
                            for (var i = 0; i < extPost.BlogPost.Categories.Count; i++)
                            {
                                int i2  = i;
                                var cId = GetOrAddId("category", post.BlogPost.Categories[i2].Ref);

                                var category = categoryLookup.FirstOrDefault(t => t.Id == cId);

                                if (category != null)
                                {
                                    if (extPost.Categories == null)
                                    {
                                        extPost.Categories = new List <Category>();
                                    }

                                    extPost.Categories.Add(category);
                                }
                            }
                        }

                        if (await ImportPostAsync(extPost))
                        {
                            PostCount++;
                        }
                        else
                        {
                            _logger.LogInformation("Post '{0}' has been skipped", extPost.BlogPost.Title);
                        }
                    }
                    catch (Exception ex)
                    {
                        _logger.LogInformation("BlogReader.LoadBlogPosts: " + ex);
                    }
                }
                else if (extPost.BlogPost.PostType == BlogPostTypes.Article)
                {
                    try
                    {
                        BlogMlExtendedPost post = extPost;

                        if (await ImportPageAsync(extPost))
                        {
                            PageCount++;
                        }
                        else
                        {
                            _logger.LogInformation("Post '{0}' has been skipped", extPost.BlogPost.Title);
                        }
                    }
                    catch (Exception ex)
                    {
                        _logger.LogInformation("BlogReader.LoadBlogPosts: " + ex);
                    }
                }
            }
        }