Необходимо заменить атрибут img src на новое значение

#winforms #c#-4.0 #html-agility-pack

#winforms #c #-4.0 #html-agility-pack

Вопрос:

Я извлекаю HTML многих веб-страниц (сохраненных ранее) с SQL Server. Моя цель — изменить атрибут src img. В HTML есть только один тег img, и его исходный код выглядит следующим образом:

...
<td colspan="3" align="center">
<img src="/crossword/13cnum1.gif" height="360" width="360" border="1"><br></td>
...

Мне нужно изменить /crossword/13cnum1.gif для http://www.nostrotech.com/crossword/13cnum1.gif

Код:

     private void ReplaceTest() {
        String currentCode = string.Empty;

        Cursor saveCursor = Cursor.Current;

        try {
            Cursor.Current = Cursors.WaitCursor;
            foreach (WebData oneWebData in DataContext.DbContext.WebDatas.OrderBy(order => order.PuzzleDate)) {
                if (oneWebData.Status == "Done" ) {

                    currentCode = oneWebData.Code;

                    #region Setup Agility
                    HtmlAgilityPack.HtmlDocument AgilityHtmlDocument = new HtmlAgilityPack.HtmlDocument {
                        OptionFixNestedTags = true
                    };

                    AgilityHtmlDocument.LoadHtml(oneWebData.PageData);
                    #endregion

                    #region Image and URL
                    var imageOnPage = from imgTags in AgilityHtmlDocument.DocumentNode.Descendants()
                                                        where imgTags.Name == "img" amp;amp;
                                                                 imgTags.Attributes["height"] != null amp;amp;
                                                                 imgTags.Attributes["width"] != null
                                                        select new {
                                                            Url = imgTags.Attributes["src"].Value,
                                                            tag = imgTags.Attributes["src"],
                                                            Text = imgTags.InnerText
                                                        };

                    if (imageOnPage == null) {
                        continue;
                    }

                    imageOnPage.FirstOrDefault().tag.Value = "http://www.nostrotech.com"   imageOnPage.FirstOrDefault().Url;                                                            
                    #endregion                  
                }
            }
        }
        catch (Exception ex) {
            XtraMessageBox.Show(String.Format("Exception: "   currentCode   "!{0}Message: {1}{0}{0}Details:{0}{2}", Environment.NewLine, ex.Message, ex.StackTrace), Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally {
            Cursor.Current = saveCursor;
        }           
    }
  

Мне нужна помощь, поскольку разметка НЕ обновляется таким образом, и мне нужно сохранить измененную разметку обратно в базу данных. Спасибо.

Ответ №1:

XPATH гораздо более понятен, чем весь этот жаргон XLinq, ИМХО… Вот как это сделать:

     HtmlDocument doc = new HtmlDocument();
    doc.Load(myHtml);

    foreach (HtmlNode img in doc.DocumentNode.SelectNodes("//img[@src and @height and @width]"))
    {
        img.SetAttributeValue("src", "http://www.nostrotech.com"   img.GetAttributeValue("src", null));
    }
  

Этот код выполняет поиск img тегов, которые имеют src , height и width атрибуты. Затем он заменяет src значение атрибута.