Here is a real simple look at the basic type structure of the BlogML schema. I'll follow it up with some detailed posts over the next week or so outlining what data each type contains:

As you can see, a blog has author details, posts and categories, while posts contain a rich set of information about each post and allow for things such as attachments - both linked and embedded.
The Support Tools
So far, there is a project that will contain the schema files for BlogML and that will also contain some tools to help consumers work with it. Presently, there is a Validator class which works with both streams or XmlTextReaders and validates them against the schema. There's also a public method for returning the schema as a stream.
There's also an abstract BlogWriter class which has all of the methods for writing BlogML format. Basically you just inherit from it and implement the InternalWriteBlog method to write your blog out as BlogML.
Finally, there is a BlogMLSerializer which is a strongly-typed wrapper around XmlSerializer to support serialization to and from BlogML format.
Here is a code dump showing how I implemented the BlogWriter for SingleUserBlog to create BlogML from my data access layer:
namespace MarkItUp.SingleUserBlog.Web.Administration
{
internal sealed class BlogMLSubWriter : BlogMLWriterBase
{
protected override void InternalWriteBlog()
{
this.WriteStartBlog(Globals.BlogTitle, Globals.BlogSubTitle);
this.WriteAuthor(Globals.UserLoginName, Globals.FromEmail);
// adding categories
this.WriteStartCategories();
foreach (Category category in DataLayer.Instance.ListCategories())
{
this.WriteCategory(
category.Id,
category.DisplayName,
category.DateCreated,
category.DateModified,
category.IsApproved,
category.Description,
null);
}
this.WriteEndElement(); // categories
// adding posts
this.WriteStartPosts();
foreach (Post post in DataLayer.Instance.ListPostsByAll())
{
this.WriteStartPost(
post.Id,
post.DisplayName,
post.DateCreated,
post.DateModified,
post.IsApproved,
post.Description,
false
);
// adding categories
CategoryCollection categories = DataLayer.Instance.ListCategoriesByPost(post.Id);
if (categories.Count > 0)
{
this.WriteStartCategories();
foreach (Category category in categories)
this.WriteCategoryReference(category.Id);
this.WriteEndElement();
}
// adding comments
FeedbackItemCollection feedbacks = DataLayer.Instance.ListFeedbackByPost(post.Id);
if (feedbacks.Count > 0)
{
this.WriteStartComments();
foreach (FeedbackItem feedback in feedbacks)
{
this.WriteComment(
feedback.Id,
feedback.DisplayName,
feedback.DateCreated,
feedback.DateModified,
feedback.IsApproved,
feedback.Username,
null,
feedback.UserUrl,
feedback.Description,
false);
}
this.WriteEndElement();
}
this.WriteEndElement();
}
this.WriteEndElement(); // posts
this.WriteEndElement(); // blog
}
}
}