public XElement ToXElement() { var headElems = new[] { new XElement("link", new XAttribute("rel", "canonical"), new XAttribute("href", URL)), new XElement("meta", new XAttribute("charset", "utf-8")), Style.IsNullOrEmpty() ? null : new XElement("meta", new XAttribute("property", "fb:article_style"), new XAttribute("content", Style)), new XElement("meta", new XAttribute("property", "fb:use_automatic_ad_placement"), new XAttribute("content", AutoAdPlacement)), Version.IsNullOrEmpty() ? null : new XElement("meta", new XAttribute("property", "op:version"), new XAttribute("content", Version)), NewsFeedTitle.IsNullOrEmpty() ? null : new XElement("meta", new XAttribute("property", "og:title"), new XAttribute("content", NewsFeedTitle)), NewsFeedDescription.IsNullOrEmpty() ? null : new XElement("meta", new XAttribute("property", "og:description"), new XAttribute("content", NewsFeedDescription)), NewsFeedImage.IsNullOrEmpty() ? null : new XElement("meta", new XAttribute("property", "og:image"), new XAttribute("content", NewsFeedImage)), new XElement("title", Title), }; var headerMedia = Items.FirstOrDefault(i => i.IsHeader && i.Type == InstantArticleItemType.Video || i.Type == InstantArticleItemType.Image); var headerMediaElem = headerMedia == null ? null : InstantArticleModelFactory.CreateFrom((int)headerMedia.ItemTypeId, headerMedia).ToXElement(); var headerAds = Items.Where(i => i.IsHeader && i.Type == InstantArticleItemType.Ad) .Select(i => InstantArticleModelFactory.CreateFrom((int)i.ItemTypeId, i)) .ToArray(); var headerAdElem = headerAds.IsNullOrEmpty() ? null : headerAds.Length == 1 ? headerAds.First().ToXElement() : new XElement("section", new XAttribute("class", "op-ad-template"), headerAds.Select(a => a.ToXElement())); var headerElems = new object[] { headerAdElem, headerMediaElem, new XElement("h1", Title), new XElement("h2", SubTitle), new XElement("h3", new XAttribute("class", "op-kicker"), Kicker), Authors.IsNullOrEmpty() ? null : Authors.Select(a => new XElement("address", a)).ToArray(), !DatePublished.HasValue ? null : new XElement("time", new XAttribute("property", "op-published"), new XAttribute("datettime", DatePublished)), !DateModified.HasValue ? null : new XElement("time", new XAttribute("property", "op-modified"), new XAttribute("datettime", DateModified)), }; var bodyElems = Items.Where(i => !i.IsHeader && !i.IsCaption) .Select(i => InstantArticleModelFactory.CreateFrom((int)i.ItemTypeId, i)) .Select(i => i.ToXElement()).ToArray(); var footerElems = new object[] { Credits.IsNullOrEmpty() ? null : new XElement("aside", Credits), Copyright.IsNullOrEmpty() ? null : new XElement("small", Copyright) }; return(new XElement("html", new XElement("head", headElems), new XElement("body", new XElement("article", new XElement("header", headerElems), bodyElems, new XElement("footer", footerElems) )))); }