WPF動態生成XML流文檔(帶縮進和顏色,以及屬性排序和換行縮進)

功能概述:

1.根據XML文本生成動態鏈表結構,具體的生成機制已經在相關博客論壇做過描述,這裏不再贅述,不然就跑題了

解析XML的完整代碼已上傳至GitHub

https://github.com/PengChen01/CodeAnalyseProject/blob/master/AnalyseXML.cs

å¾ç

2.根據XML文本生成的動態鏈表結構,通過遞歸的方式生成樹狀的深度鏈表結構,具體的生成機制已經在相關博客論壇做過描述,這裏不再贅述,不然就跑題了

解析XML的完整代碼已上傳至GitHub

https://github.com/PengChen01/CodeAnalyseProject/blob/master/AnalyseXML.cs

3.根據深度鏈表構建WPF流文檔

internal void appendXML(string xml)
{
    appendNestXMLtoParagraph(LoginSAP.AnalyseXML.getNestXML(xml)[0].subtag,"");
}

private void appendNestXMLtoParagraph(List<LoginSAP.AnalyseXML.tagNest> tagNest,string blank)
{
    Paragraph paragraph;
    Span span;
    blank += "  ";
    int attrPadding = 0;
    for (int i = 0; i < tagNest.Count; i++)
    {
        paragraph = new Paragraph();
        paragraph.FontSize = 12.67;
        paragraph.FontFamily = new FontFamily("NSimSun");
        paragraph.Margin = new Thickness(0);

        span = new Span(new Run(blank + "<"));
        span.Foreground = Brushes.Blue;
        paragraph.Inlines.Add(span);

        span = new Span(new Run(tagNest[i].tagName));
        span.Foreground = Brushes.Brown;
        paragraph.Inlines.Add(span);
        if (tagNest[i].Attribute.Count>3)
        {
            IOrderedEnumerable<KeyValuePair<string, object>> query = tagNest[i].Attribute.OrderBy(s => s.Key);//屬性多於3個,先排序,優化搜索
            span = new Span(new Run(" " + query.ElementAt(0).Key));
            span.Foreground = Brushes.Red;
            paragraph.Inlines.Add(span);

            span = new Span(new Run("=" + query.ElementAt(0).Value));
            span.Foreground = Brushes.Blue;
            paragraph.Inlines.Add(span);
            this.richTextBox1.Document.Blocks.Add(paragraph);

            attrPadding = blank.Length + 2 + tagNest[i].tagName.Length;
            for (int j = 1; j < query.Count(); j++)
            {
                //paragraph = new Paragraph();
                //paragraph.FontSize = 12.67;
                //paragraph.FontFamily = new FontFamily("NSimSun");
                //paragraph.Margin = new Thickness(0);
                paragraph.Inlines.Add(new LineBreak());
                span = new Span(new Run(" ".PadLeft(attrPadding,' ') + query.ElementAt(j).Key));
                span.Foreground = Brushes.Red;
                paragraph.Inlines.Add(span);

                span = new Span(new Run("=" + query.ElementAt(j).Value));
                span.Foreground = Brushes.Blue;
                paragraph.Inlines.Add(span);
            }
        }
        else
        {
            for (int j = 0; j < tagNest[i].Attribute.Count; j++)
            {
                span = new Span(new Run(" " + tagNest[i].Attribute.ElementAt(j).Key));
                span.Foreground = Brushes.Red;
                paragraph.Inlines.Add(span);

                span = new Span(new Run("=" + tagNest[i].Attribute.ElementAt(j).Value));
                span.Foreground = Brushes.Blue;
                paragraph.Inlines.Add(span);
            }
        }
                
        if (tagNest[i].subtag.Count ==0)
        {
            if (String.IsNullOrEmpty(tagNest[i].content))
            {
                span = new Span(new Run("/>"));
                span.Foreground = Brushes.Blue;
                paragraph.Inlines.Add(span);
                this.richTextBox1.Document.Blocks.Add(paragraph);
            }
            else
            {
                span = new Span(new Run(">"));
                span.Foreground = Brushes.Blue;
                paragraph.Inlines.Add(span);

                span = new Span(new Run(tagNest[i].content));
                span.Foreground = Brushes.DarkGreen;
                span.FontWeight = FontWeights.Bold;
                paragraph.Inlines.Add(span);

                span = new Span(new Run("</"));
                span.Foreground = Brushes.Blue;
                paragraph.Inlines.Add(span);

                span = new Span(new Run(tagNest[i].tagName));
                span.Foreground = Brushes.Brown;
                paragraph.Inlines.Add(span);

                span = new Span(new Run(">"));
                span.Foreground = Brushes.Blue;
                paragraph.Inlines.Add(span);

                this.richTextBox1.Document.Blocks.Add(paragraph);
            }
                    
        }
        else
        {
            span = new Span(new Run(">"));
            span.Foreground = Brushes.Blue;
            paragraph.Inlines.Add(span);
            this.richTextBox1.Document.Blocks.Add(paragraph);

            appendNestXMLtoParagraph(tagNest[i].subtag, blank);

            paragraph = new Paragraph();
            paragraph.FontSize = 12.67;
            paragraph.FontFamily = new FontFamily("NSimSun");
            paragraph.Margin = new Thickness(0);

            span = new Span(new Run(blank + "</"));
            span.Foreground = Brushes.Blue;
            paragraph.Inlines.Add(span);

            span = new Span(new Run(tagNest[i].tagName));
            span.Foreground = Brushes.Brown;
            paragraph.Inlines.Add(span);

            span = new Span(new Run(">"));
            span.Foreground = Brushes.Blue;
            paragraph.Inlines.Add(span);
            this.richTextBox1.Document.Blocks.Add(paragraph);

        }

	}
}

效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章