private void CreateElements( HTMLElement rootHtmlElement, DomElement rootDomElement, DocumentContentStyle currentStyle) { if (rootHtmlElement.ChildNodes == null) { return; } foreach (HTMLElement element in rootHtmlElement.ChildNodes) { if (element is HTMLCommentElement) { // 忽略注释 continue; } string tagName = element.FixTagName; switch (tagName) { case "div": { CreateElements(element, rootDomElement, currentStyle); DomElement p = this.DomDocument.CreateElement(typeof(DomParagraphFlagElement)); p.StyleIndex = this.DomDocument.ContentStyles.GetStyleIndex(currentStyle); rootDomElement.Elements.Add(p); } break; case "ul": // 原点式列表 case "ol": // 数值式列表 foreach (HTMLElement li in element.ChildNodes) { if (li.FixTagName == "li") { CreateElements(li, rootDomElement, currentStyle); DomParagraphFlagElement flag = (DomParagraphFlagElement)this.DomDocument.CreateElement(typeof(DomParagraphFlagElement)); DocumentContentStyle s = (DocumentContentStyle)currentStyle.Clone(); if (tagName == "ul") { s.BulletedList = true; } else { s.NumberedList = true; } flag.StyleIndex = this.DomDocument.ContentStyles.GetStyleIndex(s); rootDomElement.Elements.Add(flag); } //if } //foreach break; case "pre": { // 预览文本 DocumentContentStyle s = CreateStyle(element, currentStyle); DomElementList list = this.DomDocument.CreateTextElements(element.InnerText, null, s); rootDomElement.Elements.AddRange(list); DomElement p = this.DomDocument.CreateElement(typeof(DomParagraphFlagElement)); p.StyleIndex = this.DomDocument.ContentStyles.GetStyleIndex(currentStyle); rootDomElement.Elements.Add(p); break; } case "img": { // 图片 DocumentContentStyle s = CreateStyle(element, currentStyle); s.BorderColor = Color.Black; s.BorderLeft = true; s.BorderTop = true; s.BorderRight = true; s.BorderBottom = true; s.BorderWidth = 0; if (element.HasAttribute("border")) { s.BorderWidth = ToInt32(element.GetAttribute("border")); } DomImageElement img = (DomImageElement)this.DomDocument.CreateElement(typeof(DomImageElement)); img.StyleIndex = this.DomDocument.ContentStyles.GetStyleIndex(s); if (element.HasAttribute("width")) { img.Width = (float )ToLength(element.GetAttribute("width")); } if (element.HasAttribute("height")) { img.Height = ( float )ToLength(element.GetAttribute("height")); } if (element.HasAttribute("id")) { img.ID = element.GetAttribute("id"); } if (element.HasAttribute("alt")) { img.Alt = element.GetAttribute("alt"); } if (element.HasAttribute("title")) { img.Title = element.GetAttribute("title"); } if (element.HasAttribute("src")) { XImageValue v = new XImageValue(); string url = this.HtmlDocument.GetAbsoluteURL(element.GetAttribute("src")); try { string msg = string.Format(WriterStrings.Downloading_URL, url); if (this.DomDocument.EditorControl != null) { this.DomDocument.EditorControl.SetStatusText(msg); } if (this.DomDocument.Options.BehaviorOptions.DebugMode) { System.Diagnostics.Debug.Write(msg); } int len = v.Load(url); if (this.DomDocument.Options.BehaviorOptions.DebugMode) { System.Diagnostics.Debug.WriteLine(WriterUtils.FormatByteSize(len)); } } catch (Exception ext) { img.Alt = url + ":" + ext.Message; if (this.DomDocument.Options.BehaviorOptions.DebugMode) { System.Diagnostics.Debug.WriteLine(WriterStrings.Fail); } } if (this.DomDocument.EditorControl != null) { this.DomDocument.EditorControl.SetStatusText(null); } if (v.HasContent == false) { img.Alt = url; if (img.Width == 0) { img.Width = 300; } if (img.Height == 0) { img.Height = 150; } } img.Image = v; } if (img.Width == 0 || img.Height == 0) { img.UpdateSize(); } rootDomElement.Elements.Add(img); } break; case "#text": { // 纯文本片段 string text = DCSoft.Common.StringFormatHelper.NormalizeSpace(element.Text); text = System.Web.HttpUtility.HtmlDecode(text); if (string.IsNullOrEmpty(text) == false) { DomElementList cs = this._DomDocument.CreateTextElements( text, currentStyle, currentStyle); if (cs != null && cs.Count > 0) { rootDomElement.Elements.AddRange(cs); } } } break; case "p": { // 段落 DocumentContentStyle ps = CreateStyle(element, currentStyle); CreateElements(element, rootDomElement, ps); DomParagraphFlagElement flag = ( DomParagraphFlagElement )_DomDocument.CreateElement(typeof(DomParagraphFlagElement)); flag.StyleIndex = _DomDocument.ContentStyles.GetStyleIndex(ps); rootDomElement.Elements.Add(flag); } break; case "br": { // 软回车 DomLineBreakElement lb = (DomLineBreakElement)_DomDocument.CreateElement(typeof(DomLineBreakElement)); rootDomElement.Elements.Add(lb); } break; case "sup": { // 上标 DocumentContentStyle ss = ( DocumentContentStyle )currentStyle.Clone(); ss.Superscript = true; CreateElements(element, rootDomElement, ss); } break; case "sub": { // 下标 DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone(); ss.Subscript = true; CreateElements(element, rootDomElement, ss); } break; case "strong": case "b": { // 粗体 DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone(); ss.Bold = true; CreateElements(element, rootDomElement, ss); } break; case "i": { // 斜体 DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone(); ss.Italic = true; CreateElements(element, rootDomElement, ss); } break; case "strike": { // 删除线 DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone(); ss.Strikeout = true; CreateElements(element, rootDomElement, ss); } break; case "a": { // 超链接 DocumentContentStyle ss = (DocumentContentStyle)currentStyle.Clone(); ss.Color = Color.Blue; CreateElements(element, rootDomElement, ss); } break; case "font": { // 字体 DocumentContentStyle ss = CreateStyle(element, currentStyle); if (element.HasAttribute("color")) { // 文字颜色 ss.Color = ToColor(element.GetAttribute("color"), Color.Black); } if (element.HasAttribute("face")) { // 字体名称 ss.FontName = GetFontName(element.GetAttribute("face")); } if (element.HasAttribute("size")) { // 文字大小 int size = ToInt32(element.GetAttribute("size")); switch (size) { case 1: ss.FontSize = 7; break; case 2: ss.FontSize = 10; break; case 3: ss.FontSize = 12; break; case 4: ss.FontSize = 14; break; case 5: ss.FontSize = 18; break; case 6: ss.FontSize = 24; break; case 7: ss.FontSize = 35; break; } } CreateElements(element, rootDomElement, ss); } break; case "h1": case "h2": case "h3": case "h4": case "h5": case "h6": { // 标题 rootDomElement.Elements.Add(this.DomDocument.CreateElement(typeof(DomParagraphFlagElement))); float fz = 9; switch (tagName) { case "h1": fz = 24; break; case "h2": fz = 18; break; case "h3": fz = 13; break; case "h4": fz = 12; break; case "h5": fz = 10; break; case "h6": fz = 8; break; } DocumentContentStyle ss = CreateStyle(element, currentStyle); if (XDependencyObject.HasPropertyValue(ss, "FontSize")) { ss.FontSize = fz; } CreateElements(element, rootDomElement, ss); rootDomElement.Elements.Add(this.DomDocument.CreateElement(typeof(DomParagraphFlagElement))); } break; default: { DocumentContentStyle ds = CreateStyle(element, (DocumentContentStyle)currentStyle); CreateElements(element, rootDomElement, ds); } break; } //switch } //foreach }