1

HtmlAgilityPackを使用して、HTML に変換する XML ファイルを解析しています。一部のノードは、同等の HTML に変換されます。内容を維持したまま不要なものを削除する必要があります。私はそれを #text ノードに変換しようとしましたが、うまくいきませんでした。これが私のコードです:

private HtmlNode ConvertElementsPerDatabase(HtmlNode parentNode, bool transformChildNodes)
{
    var listTagsToReplace = XmlTagMapping.SelectAll(string.Empty);  // Custom Dataobject
    var node = parentNode;
    if (node != null)
    {
        var bNodeFound = false;
        if (node.Name.Equals("xref"))
        {
            bNodeFound = true;
            node = NodeXref(node);
        }
        if (node.Name.Equals("graphic"))
        {
            bNodeFound = true;
            node = NodeGraphic(node);
        }
        if (node.Name.Equals("ext-link"))
        {
            bNodeFound = true;
            node = NodeExtLink(node);
        }

        foreach (var infoTagToReplace in listTagsToReplace)
        {
            if (node.Name.Equals(infoTagToReplace.XmlTag))
            {
                bNodeFound = true;
                node.Name = infoTagToReplace.HtmlTag;
                if (!string.IsNullOrEmpty(infoTagToReplace.CssClass))
                    node.Attributes.Add("class", infoTagToReplace.CssClass);

                if (node.HasAttributes)
                {
                    var listTagAttributeToReplace = XmlTagAttributeMapping.SelectAll_TagId(infoTagToReplace.Id); // Custom Dataobject
                    for (int i = 0; i < node.Attributes.Count; i++ )
                    {
                        var bDeleteAttribute = true;
                        foreach (var infoTagAttributeToReplace in listTagAttributeToReplace)
                        {
                            if (infoTagAttributeToReplace.XmlName.Equals(node.Attributes[i].Name))
                            {
                                node.Attributes[i].Name = infoTagAttributeToReplace.HtmlName;
                                bDeleteAttribute = false;
                            }
                        }
                        if (bDeleteAttribute)
                            node.Attributes.Remove(node.Attributes[i].Name);
                    }
                }
            }
        }
        if (transformChildNodes)
            for (int i = 0; i < parentNode.ChildNodes.Count; i++)
                parentNode.ChildNodes[i] = ConvertElementsPerDatabase(parentNode.ChildNodes[i], true);

        if (!bNodeFound)
        {
            // Replace with #text
        }
    }
    return parentNode;
}

最後に、ノードが見つからない場合は、ノードの置換を行う必要があります ("Replace with #text" コメントが表示されている場所)。私は一日中髪(残っているもの)を引き裂いていますが、それはおそらく何かばかげたことです. コンパイルのヘルプを得ることができず、オンライン バージョンもありません。スタックオーバーフローを助けて!あなたは私の唯一の希望です。;-)

4

1 に答える 1

0

私はあなたがこれを行うことができると思います:

return new HtmlNode(HtmlNodeType.Text, parentNode.OwnerDocument, 0);

もちろん、これによりドキュメントの先頭にノードが追加されますが、ドキュメント内のどこにノードを追加する必要があるかを処理するための何らかのコードが配置されていると思います。

ドキュメントのコメントに関しては、Html Agility Pack ドキュメントの現在 (この記事の執筆時点) のダウンロードには、表示するためにコンパイルを必要としない CHM ファイルが含まれています。

于 2009-12-30T08:30:45.053 に答える