10

HTMLAgilityPack を使用して新しいイメージ ノードを書き出すと、イメージの終了タグが削除されているように見えます。

string strIMG = "<img src='" + imgPath + "' height='" + pubImg.Height + "px' width='" + pubImg.Width + "px' />";

HtmlNode newNode = HtmlNode.Create(strIMG);

これはxhtmlを壊します。

4

4 に答える 4

22

Micky が提案するように XML を出力するように指示することは機能しますが、XML を必要としない他の理由がある場合は、これを試してください。

doc.OptionWriteEmptyNodes = true;
于 2009-11-24T11:43:17.790 に答える
3

編集 1:HTML Agilty Pack ドキュメントを修正して、画像 (img) タグを正しく表示する方法は次のとおりです。

if (HtmlNode.ElementsFlags.ContainsKey("img"))
{   HtmlNode.ElementsFlags["img"] = HtmlElementFlag.Closed;}
else
{   HtmlNode.ElementsFlags.Add("img", HtmlElementFlag.Closed);}

他のタグも「img」に置き換えて修正してください (input、select、および option が頻繁に出てきます)。必要に応じて繰り返します。HAP バグにより、"closed" フラグと "empty" フラグが同時に設定されないため、これは ではなく生成されることに注意してください。 出典:マイク・ブリッジ

元の回答: この問題の解決策に苦労しただけで、十分な回答 (doctype を適切に設定、XML として出力、構文のチェック、AutoCloseOnEnd、空のノードの書き込みオプションを使用) が見つからなかったので、汚いハックでこれを解決できました。 . これは確かにすべての人にとって問題を完全に解決するわけではありませんが、生成された html/xml を文字列として返す人 (例: Web サービス経由) の場合、簡単な解決策は、アジリティ パックが壊れることを知らない偽のタグを使用することです。ドキュメントで行う必要があるすべての処理が完了したら、次のメソッドをタグごとに 1 回呼び出して頭痛の種にします (顕著な例としては、option、input、および img があります)。直後に、最終的な文字列をレンダリングし、文字列 (この場合は "Fix_") で始まる各タグを簡単に置き換えて、文字列を返します。

private void fixHAPUnclosedTags(ref HtmlDocument doc, string tagName, bool hasInnerText = false)
{
    HtmlNode tagReplacement = null;
    foreach(var tag in doc.DocumentNode.SelectNodes("//"+tagName))
    {
        tagReplacement = HtmlTextNode.CreateNode("<fix_"+tagName+"></fix_"+tagName+">");
        foreach(var attr in tag.Attributes)
        {
            tagReplacement.SetAttributeValue(attr.Name, attr.Value);
        }
        if(hasInnerText)//for option tags and other non-empty nodes, the next (text) node will be its inner HTML
        {
            tagReplacement.InnerHtml = tag.InnerHtml + tag.NextSibling.InnerHtml;
            tag.NextSibling.Remove();
        }
        tag.ParentNode.ReplaceChild(tagReplacement, tag);
    }
}

注として、もし私が賭け屋だったら、上記のMikeBridgeの答えがパック内のこのバグの原因をうっかり特定していると推測するでしょう - 何かがクローズドフラグと空のフラグを相互に排他的にさせている

さらに、もう少し掘り下げてみると、このアプローチを採用したのは私だけではないようです: HtmlAgilityPack Drops Option End Tags

さらに、空でない要素のみが必要な場合は、同じ質問にリストされている非常に単純な修正と、HAP コードプレックスの議論がここにあります。

于 2012-08-23T16:39:51.190 に答える
2

この問題を解消する XML 出力をオンにするオプションがあります。

var htmlDoc = new HtmlDocument();
htmlDoc.OptionOutputAsXml = true;
htmlDoc.LoadHtml(rawHtml);
于 2009-10-13T01:15:11.037 に答える
1

これは HtmlAgilityPack のバグのようです。これを再現するには多くの方法があります。たとえば、次のようになります。

Debug.WriteLine(HtmlNode.CreateNode("<img id=\"bla\"></img>").OuterHtml);

不正な HTML を出力します。他の回答で提案された修正を使用しても何も起こりません。

HtmlDocument doc = new HtmlDocument();
doc.OptionOutputAsXml = true;
HtmlNode node = doc.CreateElement("x");
node.InnerHtml = "<img id=\"bla\"></img>";
doc.DocumentNode.AppendChild(node);
Debug.WriteLine(doc.DocumentNode.OuterHtml);

不正な形式の XML / XHTML のようなものを生成します<x><img id="bla"></x>

これについては、CodePlex で問題を作成しました。

于 2012-07-26T09:26:57.743 に答える