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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2016, 13:54   #1
Vita1y
 
Регистрация: 07.07.2012
Сообщений: 6
По умолчанию XML парсинг в c#

Здравствуйте! Помогите пожалуйста, всю голову уже сломал.
Как правильно получить изображение из xml от vk api ?
Вот пример xml http://api.vk.com/method/wall.get.xm...in=sci&count=5

Мне в цикле необходимо получить адрес картинки "photo_604". в elm эта информация есть, но я не могу сослаться на нее.


Код:
                var webRequest =
                HttpWebRequest.Create("http://api.vk.com/method/wall.get.xml?v=5.45&filter=all&domain=sci&count=5");
                var webResponse = webRequest.GetResponse();
                var stream = webResponse.GetResponseStream();
                var xDoc = XDocument.Load(stream);
                dt = CreateTable();
                
                DataRow newRow = null;
                
                foreach (XElement elm in xDoc.Descendants("post"))
                {
                    newRow = dt.NewRow();
                    
                    if (elm.Element("id") != null)
                    {
                        newRow["id"] = elm.Element("id").Value;
                    }
                    
                    if (elm.Element("text") != null)
                    {
                        newRow["Текст"] = elm.Element("text").Value;
                    }

                   if (elm.Element("date") != null)
                    {
                       newRow["дата поста"] = UnixTimeStampToDateTime(int.Parse(elm.Element("date").Value));
                    }

                    if (elm.Element("likes") != null)
                    {
                        newRow["Лайк"] = int.Parse(elm.Element("likes").Value);
                    }

                    if (elm.Element("reposts") != null)
                    {
                        newRow["репост"] = int.Parse(elm.Element("reposts").Value);
                    }

                    if (elm.Element("photo_604") != null)
                    {
                        newRow["фото"] = elm.Element("photo_604").Value;
                    }

                    if (elm.Element("photo_604") != null)
                    {
                         HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(elm.Element("photo_604").Value);
                         myRequest.Method = "GET";
                         HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
                         System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myResponse.GetResponseStream());
                         myResponse.Close();                       
                         newRow["картинка"] = bmp;
                    }
                   
                    dt.Rows.Add(newRow);
                }
            }

Последний раз редактировалось Vita1y; 10.03.2016 в 14:42.
Vita1y вне форума Ответить с цитированием
Старый 11.03.2016, 00:44   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Не совсем по теме добавлю, может пригодится:
- XML удобно парсить с помощью System.Xml.Linq (хорошие видео уроки)
- использовать async/await, чтобы не фризилось окно (может у вас это есть, но на всякий случай написал)

Мой пример выводит имя и фамилию пользователя из vk:

Код:
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;

/*
<?xml version="1.0" encoding="utf-8"?>
<response list="true">
 <user>
  <id>1</id>
  <first_name>Павел</first_name>
  <last_name>Дуров</last_name>
 </user>
</response>
*/

namespace GetXmlFromVk
{
    class User
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            textBoxOutput.ScrollBars = ScrollBars.Both;
            textBoxOutput.WordWrap = false;
        }

        private async void buttonGetXmlFromVk_Click(object sender, EventArgs e)
        {
            buttonGetXmlFromVk.Enabled = false;
            await GetXmlFromVk();
            buttonGetXmlFromVk.Enabled = true;
        }

        private async Task GetXmlFromVk()
        {
            using (var client = new HttpClient())
            {
                var resp = await client.GetStringAsync("https://api.vk.com/method/users.get.xml?user_id=1&v=5.45");

                XDocument xmlDoc = XDocument.Parse(resp);

                var query = from user in xmlDoc.Descendants("user")
                            select new User
                            {
                                Id = (int)user.Element("id"),
                                FirstName = user.Element("first_name").Value.ToString(),
                                LastName = user.Element("last_name").Value.ToString()
                            };

                foreach (var user in query)
                {
                    textBoxOutput.Text += user.FirstName + " " + user.LastName;
                }
            }
        }
    }
}
8Observer8 вне форума Ответить с цитированием
Старый 11.03.2016, 04:32   #3
Vita1y
 
Регистрация: 07.07.2012
Сообщений: 6
По умолчанию

8Observer8, спасибо. имя достать-не проблема. Проблема со сложной структурой.
Видео посмотрел- ответа не нашел.

Переписал код вот так
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;

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

        private void button1_Click(object sender, EventArgs e)
        {

            dataGridView1.DataSource = GetVkpostslist();
           

        }

        public class Vkpost
        {
            public int ID { get; set; }
            public int from_id { get; set; }
            public int owner_id { get; set; }
            public DateTime date { get; set; }
            public string post_type { get; set; }
            public string text { get; set; }
            public bool is_pinned { get; set; }
            public int comments { get; set; }
            public int likes { get; set; }
            public int reposts { get; set; }
            public attachmentslist attachmentslist { get; set; }
        }

        public class attachmentslist
        {
           public List<imginfo> img = new List<imginfo>();
        }

        public class imginfo
        {
            public string photo_75 { get; set; }
            public string photo_130 { get; set; }
            public string photo_604 { get; set; }
            public string idphoto { get; set; }

        }

        public List<Vkpost> GetVkpostslist()
        {
            var webRequest =
                HttpWebRequest.Create("http://api.vk.com/method/wall.get.xml?v=5.45&filter=all&domain=sci&count=5");
            var webResponse = webRequest.GetResponse();
            var stream = webResponse.GetResponseStream();
            var xmlDoc = XDocument.Load(stream);
           var Vkpost =
                from post in xmlDoc.Descendants("post")
                select new Vkpost
                {
                    ID = Convert.ToInt32(post.Element("id").Value),
                    text = post.Element("text").Value,
                    likes = Convert.ToInt32(post.Element("likes").Value),
                    attachmentslist = new attachmentslist()
                    {
                        img = new List<imginfo>(from im in post.Descendants("photo")
                            select new imginfo()
                            {
                                photo_604 = im.Element("photo_604").Value,
                                photo_130 = im.Element("photo_130").Value,
                                idphoto = im.Element("id").Value,
                                photo_75 =im.Element("photo_75").Value

                            })
                    }
                };
            return Vkpost.ToList();
        }

        
    }
}
Все равно не работает.

Последний раз редактировалось Vita1y; 11.03.2016 в 04:45.
Vita1y вне форума Ответить с цитированием
Старый 19.03.2016, 01:13   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Vita1y, что у вас получилось?

Я сделал пример с вашим запросом (wall.get). Вывожу картинку со стены на окно. У меня vk-запрос и загрузка картинки происходят в ассинхронных режимах (async/await)

Использую Json (eсли хотите, могу переделать под XML)

Код:
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Http;
using Newtonsoft.Json.Linq;
using System.Drawing;
using System.IO;

namespace GetVkWallPicturesByJson
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            textBoxOutput.ScrollBars = ScrollBars.Both;
            textBoxOutput.WordWrap = false;
        }

        private async void buttonGetPictures_Click(object sender, EventArgs e)
        {
            buttonGetPictures.Enabled = false;
            await GetPictures();
            buttonGetPictures.Enabled = true;
        }

        private async Task GetPictures()
        {
            using (var client = new HttpClient())
            {
                var resp = await client.GetStringAsync("http://api.vk.com/method/wall.get?v=5.45&filter=all&domain=sci&count=5");

                JObject json = JObject.Parse(resp);

                JArray items = (JArray)json["response"]["items"];

                JArray attachments = (JArray)items[0]["attachments"];

                JObject photo = (JObject)attachments[0]["photo"];

                var photoURL = photo["photo_604"].ToString();

                var imageByteArray = await client.GetByteArrayAsync(photoURL);

                pictureBoxPhoto.Image = byteArrayToImage(imageByteArray);

                // Count of items
                //textBoxOutput.Text += "count = " + items.Count.ToString();
            }
        }

        private Image byteArrayToImage(byte[] byteArrayIn)
        {
            using (var ms = new MemoryStream(byteArrayIn))
            {
                return Image.FromStream(ms);
            }
        }
    }
}

Последний раз редактировалось 8Observer8; 19.03.2016 в 01:18.
8Observer8 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг XML sergei92 C++ Builder 2 09.09.2015 11:22
Парсинг xml Dewi1 PHP 9 19.05.2014 21:26
C#. Парсинг XML-файла с использованием библиотеки System.xml.linq Gift020 Помощь студентам 5 04.04.2013 13:44
Парсинг XML. Abuhamed PHP 1 01.06.2011 22:24
Парсинг XML [Smarik] Общие вопросы Delphi 6 13.03.2010 17:38