Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2016, 08:42   #1
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию Почему не все элементы массива заменяются

Слева listBox1, справа listBox2.
Хочу с первого текстбокса найденные ссылки на картинки (listBox1) вставить во второй текстбокс дополненные сслыки (listBox2). Почему не до конца заменяются?
Код:
using System;
using System.Windows.Forms;

namespace TextWorks
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Init();
        }

        private void Init()
        {
            textBox1.Text = @"<meta property='og: title' content='Forbes Казахстан' />
                            < meta property = 'og:type' content = 'website' />
                            < meta property = 'og:url' content = 'http://www.forbes.kz' />
                            < meta property = 'og:image' content = '/images/og_logo_forbes.jpg'/>
                            < meta property = 'og:image' content = '/images/front_forbes.jpg'/>
                            < meta property = 'og:image' content = '/images/bottom_forbes.jpg'/>
                            < meta property = 'og:image' content = '/images/bg_forbes.png'/>
                            < meta property = 'og:image' content = '/images/center_forbes.jpg'/>
                            ";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox2.Text = textBox1.Text.Replace(listBox1.Items[0].ToString(), listBox2.Items[0].ToString());

            for (int j = 1; j < listBox1.Items.Count - 1; j++)
            {
                textBox2.Text = textBox2.Text.Replace(
                    listBox1.Items[j].ToString(),
                    listBox2.Items[j].ToString()
                    );
            }
        }
    }
}
Изображения
Тип файла: png скрин.png (24.3 Кб, 48 просмотров)
helpkz вне форума Ответить с цитированием
Старый 14.03.2016, 08:52   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Потому что такое условие в цикле.
И в 4 png.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 14.03.2016, 12:58   #3
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Потому что такое условие в цикле.
И в 4 png.
Спасибо. Не внимательно посмотрел.
helpkz вне форума Ответить с цитированием
Старый 15.03.2016, 19:16   #4
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Все-таки не корректно работает. В textBox вставил другой текст, соответственно в listBox-ах поменял ссылки. Меняет, но по-разному, то 2 раза вставляет http://, то вообще не видит.
Сверху textBox1 оригинал текста, снизу - уже заменены ссылки.
Слева ссылки, которые надо найти (listBox1), справа ссылки которые надо вставить (listBox2).
Код:
string txt1;

        public Form1()
        {
            InitializeComponent();
            Init();
        }

        private void Init()
        {
            if (File.Exists("DocumentText.txt"))
            {
                txt1 = File.ReadAllText("DocumentText.txt", System.Text.Encoding.GetEncoding(1251));
            }
            else
            {
                textBox1.Text = "file is not found.";
            }

            textBox1.Text = txt1;
        }
        

        private void button2_Click(object sender, EventArgs e)
        {
            textBox2.Text = textBox1.Text.Replace(listBox1.Items[0].ToString(), listBox2.Items[0].ToString());

            for (int j = 1; j < listBox1.Items.Count; j++)
            {
                textBox2.Text = textBox2.Text.Replace(
                    listBox1.Items[j].ToString(),
                    listBox2.Items[j].ToString()
                    );
            }
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.DocumentText = textBox2.Text;
        }
Изображения
Тип файла: jpg скрин2.jpg (54.9 Кб, 115 просмотров)
helpkz вне форума Ответить с цитированием
Старый 15.03.2016, 19:59   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Может 2 раза повторяется строка в первом списке?

Советую взять нормальный HTML парсер. Например HtmlAgilityPack
Код:
using System;
using HtmlAgilityPack;

namespace ConsoleApplication23
{
    class Program
    {
        static string MakeLinksAbsolute(string html, string baseAddress)
        {
            var htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(html);

            var imgNodes = htmlDoc.DocumentNode.SelectNodes("//img[not(contains(@src, 'http'))]");

            foreach (var imgNode in imgNodes)
            {
                imgNode.Attributes["src"].Value = baseAddress + imgNode.Attributes["src"].Value;
            }

            return htmlDoc.DocumentNode.OuterHtml;            
        }

        static void Main(string[] args)
        {
            string html = 
@"<div>
     <img src=""/image.png"" width=""16"" height=""16"">
</div>
";
            string newHtml = MakeLinksAbsolute(html, "http://google.com");

            Console.WriteLine(newHtml);
        }
    }
}
А задача в чем? Откуда вы взяли HTML и зачем заменяете в нем адреса на абсолютные?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 16.03.2016 в 12:44.
Alex11223 вне форума Ответить с цитированием
Старый 16.03.2016, 06:46   #6
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А задача в чем? Откуда вы взяли HTML и зачем заменяете в нем адреса на абсолютные?
HTML код хочу отобразить в браузере, а т.к. ссылки неполные, то там пустые картинки. Хочу найти все элементы с тегом img вида: /logist/basic_icons/cut.png и прибавить к нему http://sveta.mobi
helpkz вне форума Ответить с цитированием
Старый 16.03.2016, 06:54   #7
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Может 2 раза повторяется строка в первом списке?
Там простой html код без повторений.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Советую взять нормальный HTML парсер. Например HtmlAgilityPack
Я пока в этом новичок, даже не знаю что сказать
Вложения
Тип файла: rar Debug.rar (7.1 Кб, 7 просмотров)
helpkz вне форума Ответить с цитированием
Старый 16.03.2016, 09:10   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
HTML код хочу отобразить в браузере, а т.к. ссылки неполные, то там пустые картинки.
Это я и так понял, цель-то какая? Почему просто сайт не открыть в нем? Картинки скорее всего не единственное что не будет работать (ссылки, адреса в JS, любые действия требующие cookie, ...).

Цитата:
Там простой html код без повторений.
Я про список для замены.

Цитата:
Я пока в этом новичок
И что?
Цитата:
даже не знаю что сказать
Что сказать? Я ж показал более простой способ без добавления 100500 строк в список. Надо только библиотеку подключить, например через NuGet

Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 16.03.2016 в 09:16.
Alex11223 вне форума Ответить с цитированием
Старый 16.03.2016, 09:48   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Может просто тэг добавить?
http://htmlbook.ru/html/base
pu4koff вне форума Ответить с цитированием
Старый 16.03.2016, 10:52   #10
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Это я и так понял, цель-то какая?
У себя в проекте, нажимаю на кнопки, которые кликают по определенным ссылкам вида:
<a href="/remove_task/3599876"> Рассчитать</a> Естественно ссылку перед этим дополняю.

Как я это делаю:
Посылаю запрос на сервер
Код:
private void MethodCreate(string address)
        {
            request = (HttpWebRequest)WebRequest.Create(address);
            request.CookieContainer = cc;
        }

private void ResponseData()
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream());

            webBrowser1.DocumentText = reader.ReadToEnd();
            reader.Close();
            response.Close();
        }
Ответ приходит в виде HTML-кода с неполными ссылками. Этот HTML-код хочу отобразить в браузере, но в браузере отображается в основном текстовая информация, а хотелось бы по-красивее, с картинками. Это не так критично, просто хотел узнать почему не в полном виде. Посмотрел код и как вы уже поняли увидел неполные ссылки на картинки, которые я хотел с помощью простой команды Replace заменить их на полноценные. Вот такая логика.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Почему просто сайт не открыть в нем? Картинки скорее всего не единственное что не будет работать (ссылки, адреса в JS, любые действия требующие cookie, ...).
Мне нужно только отобразить их в браузере, действия выполняется через созданные функции.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Я про список для замены.
Посмотрел, оказывается несколько ссылок повторяются. Спасибо за подсказку.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что сказать? Я ж показал более простой способ без добавления 100500 строк в список. Надо только библиотеку подключить, например через NuGet
Я это слово-то, парсер, Nuget, пару раз слышал, никогда не сталкивался с этим. Почитаю конечно же.
helpkz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан числовой массив А, состоящий из n целых чисел . Если все элементы массива являютя чётными, то увеличьте положительные элементы Pantiks Паскаль, Turbo Pascal, PascalABC.NET 1 24.10.2013 16:59
Все отрицательные элементы массива увеличить на величину, равную среднему значению положительных элементов массива ksenia/shtepa C# (си шарп) 4 04.05.2012 19:10
Турбо ассемблер - построить массив путём сдвига исходного массива и умножить все элементы полученного массива на два Александр16 Помощь студентам 5 12.02.2012 20:30
Элементы матрицы. Все ненулевые элементы массива D(k) расположить в начале массива E(k) и подсчитать их к Вася Маклауд Помощь студентам 0 03.04.2011 17:21
1.Найти в матрице первую строку, все элементы которой отрицательны 2.отсортировать элементы массива по в w0lf16 Помощь студентам 2 22.11.2009 15:47