13

そのため、HtmlAgilityPack を使用して html を生成していますが、完全に機能していますが、html テキストはインデントされていません。ただし、インデントされた XML を取得できますが、HTML が必要です。方法はありますか?

HtmlDocument doc = new HtmlDocument();

// gen html
HtmlNode table = doc.CreateElement("table");
table.Attributes.Add("class", "tableClass");
HtmlNode tr = doc.CreateElement("tr");
table.ChildNodes.Append(tr);
HtmlNode td = doc.CreateElement("td");
td.InnerHtml = "—";
tr.ChildNodes.Append(td);

// write text, no indent :(
using(StreamWriter sw = new StreamWriter("table.html"))
{
        table.WriteTo(sw);
}

// write xml, nicely indented but it's XML!
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
using (XmlWriter xw = XmlTextWriter.Create("table.xml", settings))
{
        table.WriteTo(xw);
}
4

4 に答える 4

8

高速で信頼性が高く、純粋な C#、.NET Core 互換の AngleSharp

自動インデントの方法を提供するAngleSharpで解析できます。

var parser = new HtmlParser();
var document = parser.ParseDocument(text);
using (var writer = new StringWriter())
{
    document.ToHtml(writer, new PrettyMarkupFormatter
                            {
                                Indentation = "\t",
                                NewLine = "\n"
                            });
    var indentedText = writer.ToString();
}
于 2019-03-08T08:35:53.500 に答える
6

いいえ、それは「設計による」選択です。XML (または、HTML ではなく XML である XHTML) と HTML との間には大きな違いがあります。

空白を変更すると、一部のブラウザーが特定の HTML チャンク、特に不正な形式の HTML (通常、ライブラリによって適切に処理される) をレンダリングする方法が変更される可能性があるため、これはそれほど小さな改善ではありません。また、Html Agility Pack は、マークアップの記述方法を最小限にするのではなく、HTML のレンダリング方法を維持するように設計されています。

私はそれが実現不可能だとか不可能だと言っているのではありません。明らかに、XML に変換して出来上がります (これを簡単にするために拡張メソッドを作成することもできます) が、一般的なケースでは、レンダリングされた出力は異なる場合があります。

于 2011-05-11T18:45:42.840 に答える
4

私の知る限り、HtmlAgilityPack はこれを行うことができません。ただし、同様の質問で提案されている html tidy packs を調べることができます。

于 2011-05-10T10:45:39.523 に答える
1

HtmlAgilityPack は、読み取り可能な出力を作成できない Html (または私の場合は asp) ファイルの読み取りと変更に優れていますが、同じ経験をしました。

しかし、私は自分のために働くいくつかのコード行を書くことになりました:

「m_htmlDocument」という名前の HtmlDocument を使用して、次のように HTML ファイルを作成します。

file = new System.IO.StreamWriter(_sFullPath);
            if (m_htmlDocument.DocumentNode != null)
                foreach (var node in m_htmlDocument.DocumentNode.ChildNodes)
                    WriteNode(file, node, 0);

void WriteNode(System.IO.StreamWriter _file, HtmlNode _node, int _indentLevel)
    {
        // check parameter
        if (_file == null) return;
        if (_node == null) return;

        // init 
        string INDENT = " ";
        string NEW_LINE = System.Environment.NewLine;

        // case: no children
        if(_node.HasChildNodes == false)
        {
            for (int i = 0; i < _indentLevel; i++)
                _file.Write(INDENT);
            _file.Write(_node.OuterHtml);
            _file.Write(NEW_LINE);
        }

        // case: node has childs
        else
        {
            // indent
            for (int i = 0; i < _indentLevel; i++)
                _file.Write(INDENT);

            // open tag
            _file.Write(string.Format("<{0} ",_node.Name));
            if(_node.HasAttributes)
                foreach(var attr in _node.Attributes)
                    _file.Write(string.Format("{0}=\"{1}\" ", attr.Name, attr.Value));
            _file.Write(string.Format(">{0}",NEW_LINE));

            // childs
            foreach(var chldNode in _node.ChildNodes)
                WriteNode(_file, chldNode, _indentLevel + 1);

            // close tag
            for (int i = 0; i < _indentLevel; i++)
                _file.Write(INDENT);
            _file.Write(string.Format("</{0}>{1}", _node.Name,NEW_LINE));
        }
    }
于 2015-07-18T16:30:51.353 に答える