Найти изображения с определенным именем класса HTML - PullRequest
0 голосов
/ 12 марта 2010

У меня есть некоторая разметка, которая содержит определенные теги изображений HTML с указанным классом. Мне нужно найти все эти изображения, добавить тег привязки вокруг изображения, установить атрибут href привязки для значения src изображений (путь к изображению) и, наконец, заменить значение src изображений новым значением (я вызываю метод, который будет возвращать это значение).

<p>Some text here <img src="/my/path/image.png" alt="image description" class="featured" />. Some more text and another image that should not be modified <img src="/my/path/image2.png" alt="image description" /></p>

Должен стать.

<p>Some text here <a href="/my/path/image.png"><img src="/new/path/from/method.png" alt="image description" class="featured" /></a>. Some more text and another image that should not be modified <img src="/my/path/image2.png" alt="image description" /></p>

Ответы [ 2 ]

0 голосов
/ 12 марта 2010

Заканчивается этим кодом.

using System;

с использованием System.Reflection; используя HtmlAgilityPack; используя log4net;

namespace Company.Web.Util { открытый статический класс HtmlParser { приватное статическое чтение только ILog _log = LogManager.GetLogger (MethodBase.GetCurrentMethod (). DeclaringType); приватный статический HtmlDocument _htmlDocument;

    public static string Parse(string input)
    {
        _htmlDocument = new HtmlDocument();

        _htmlDocument.LoadHtml(input);
        ParseNode(_htmlDocument.DocumentNode);

        return _htmlDocument.DocumentNode.WriteTo().Trim();
    }

    private static void ParseChildren(HtmlNode parentNode)
    {
        for (int i = parentNode.ChildNodes.Count - 1; i >= 0; i--)
        {
            ParseNode(parentNode.ChildNodes[i]);
        }
    }

    private static void ParseNode(HtmlNode node)
    {
        if (node.NodeType == HtmlNodeType.Element)
        {
            if (node.Name == "img" && node.HasAttributes)
            {
                for (int i = node.Attributes.Count - 1; i >= 0; i--)
                {
                    HtmlAttribute currentAttribute = node.Attributes[i];
                    if ("class" == currentAttribute.Name && currentAttribute.Value.ToLower().Contains("featured"))
                    {
                        try
                        {
                            string originaleImagePath = node.Attributes["src"].Value;

                            string imageThumbnailPath = GetImageThumbnail(originaleImagePath);

                            var anchorNode = HtmlNode.CreateNode("<a>");
                            var imageNode = HtmlNode.CreateNode("<img>");

                            imageNode.SetAttributeValue("alt", node.Attributes["alt"].Value);
                            imageNode.SetAttributeValue("src", imageThumbnailPath);

                            anchorNode.SetAttributeValue("href", originaleImagePath);

                            anchorNode.AppendChild(imageNode);
                            node.ParentNode.InsertBefore(anchorNode, node);

                            node.ParentNode.RemoveChild(node);
                        }
                        catch (Exception exception)
                        {
                            if (_log.IsDebugEnabled)
                            {
                                _log.WarnFormat("Some message: {0}", exception);
                            }
                        }
                    }
                }
            }
        }

        if (node.HasChildNodes)
        {
            ParseChildren(node);
        }
    }
}

}

0 голосов
/ 12 марта 2010

Не используйте RegEx для разбора HTML. См. этот классический ответ SO по причинам.

Используйте взамен HTML Agility Pack - вы можете использовать XPath для запроса вашего HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...