3

私は基本的に、いくつかのhtmlコードのデータベースから文字列を持っています。ここで、asp.net Webページの何らかのテキストエリアにhtmlコードを表示したいと思います。そこから、ユーザーはインデントなどを含むhtmlコードを編集できます...そして、ユーザーはhtmlコードを元の場所に保存できますデータベース。

アンマネージド コードを使用する TidyManaged について読んだことがありますが、これはアンマネージド コードを使用したくありません。

HTMLコードをフォーマットするためにこれを説明するサンプルコード、またはWebサイトはありますか - Html Formatter

どんな指示や助けも大歓迎です。

編集 :

解析されたhtml文字列が適合しない可能性があることを念頭に置いて、htmlタグをインデントしたいだけです。これは、このアプリケーションでは問題ありません。

使用される html 文字列の例 -

string a = "<html><body><h1>hello</h1></body></html>

出力は次のようになります

<html>
  <body>
    <h1>
      hello
    </h1>
  </body>
</html>
4

2 に答える 2

3

これは長いですが、基本的なニーズには十分対応できると思います。ライブラリを使用するのではなく、自分で作成することにしました...おそらく最も効率的なコードではありません:)

    /// <summary>
    /// This function creates an indented format of HTML with new lines for all elements and text.  Errors result in the original text being returned.
    /// </summary>
    private static string FormatHtml(string content)
    {
        string original = content; 
        string open = "<";
        string slash = "/";
        string close = ">";

        int depth = 0; // the indentation
        int adjustment = 0; //adjustment to depth, done after writing text

        int o = 0; // open      <   index of this character
        int c = 0; // close     >   index of this character
        int s = 0; // slash     /   index of this character
        int n = 0; // next      where to start looking for characters in the next iteration
        int b = 0; // begin     resolved start of usable text
        int e = 0; // end       resolved   end of usable test

        string snippet;

        try
        {
            using (StringWriter writer = new StringWriter())
            {
                while (b > -1 && n > -1)
                {
                    o = content.IndexOf(open, n);
                    s = content.IndexOf(slash, n);
                    c = content.IndexOf(close, n);
                    adjustment = 0;

                    b = n; // begin where we left off in the last iteration
                    if (o > -1 && o < c && o == n)
                    {
                        // starts with "<tag>text"
                        e = c; // end at the next closing tag
                        adjustment = 2; //for after this node
                    }
                    else
                    {
                        // starts with "text<tag>"
                        e = o - 1; // end at the next opening tag
                    }

                    if (b == o && b + 1 == s) // ?Is the 2nd character a slash, this the a closing tag: </div>
                    {
                        depth -= 2;//adjust immediately, not afterward ...for closing tag
                        adjustment = 0;
                    }

                    if ((s + 1) == c && c == e) // don't adjust depth for singletons:  <br/>
                    {
                        adjustment = 0;
                    }



                    //string traceStart = content.Substring(0, b);
                    int length = (e - b + 1);
                    if (length < 0)
                    {
                        snippet = content.Substring(b); // happens on the final iteration
                    }
                    else
                    {
                        snippet = content.Substring(b, (e - b + 1));
                    }
                    //string traceEnd = content.Substring(b);


                    if (snippet == "<br>" || snippet == "<hr>") // don't adjust depth for singletons which lack slashes: <br>
                    {
                        adjustment = 0; 
                    }

                    //Write the text
                    if (!string.IsNullOrEmpty(snippet.Trim()))
                    {
                        //Debug.WriteLine(snippet);
                        writer.Write(Environment.NewLine);
                        if (depth > 0) writer.Write(new String(' ', depth)); // add the indentation 
                        writer.Write(snippet); 
                    }

                    depth += adjustment; //adjust for the next line which is likely nested

                    n = e + 1; // the next iteration start at the end of this one.

                }

                return writer.ToString();
            }
        }
        catch (Exception ex)
        {
            Log("Unable to format html. " + ex.Message);
            return original;
        }
    }
于 2017-07-18T02:12:13.243 に答える