Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
4 / 4 / 0
Регистрация: 28.06.2013
Сообщений: 24
1

Получаю xml по url, как сохранить содержимое в новый xml файл, только чтобы структура не нарушилась?

10.12.2014, 21:13. Показов 2132. Ответов 5
Метки нет (Все метки)

Когда делаю так, структура нарушается

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WebRequest request = WebRequest.Create(@"http://xml.weather.co.ua/1.2/forecast/27?dayf=5&userid=fdsf_com_ua&lang=ru");
            using (var response = request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    if (stream != null)
                        using (
                            var reader = new StreamReader(stream))
                        {
                            
                            using (var writer = new StreamWriter("weather.xml", false))
                            {
                                writer.Write(reader.ReadToEnd());
                            }
                        }
                }
            }
Когда так, то ничего не записывается в файл

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WebRequest request1 = WebRequest.Create(@"http://xml.weather.co.ua/1.2/forecast/27?dayf=5&userid=fdsf_com_ua&lang=ru");
            using (var response = request1.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    if (stream != null)
                        using (
                            var reader = new XmlTextReader(stream))
                        {
                            
                            using (var writer = new XmlTextWriter("weather1.xml", Encoding.UTF8))
                            {
                                writer.WriteString(reader.ReadString());
                            }
                        }
                }
            }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2014, 21:13
Ответы с готовыми решениями:

Как сохранить содержимое xml файла (без парсинга) в MySql и как потом xml от туда извлечь
делаю так: $xml_string=file_get_contents($uploadfile); //путь к файлу xlm ...

Как сериализовать элемент TreeView что бы сохранить его содержимое в XML файл?
Здравствуйте, как сохранить дерево TreeView? Возможно ли сохранить xaml код TreeView, а потом его...

Сохранить содержимое Edit в файл xml
Перешуршал весь гугл не нашол как сохранять содержимое Edit в файл xml. Нашол информацию что нужно...

Может ли js добавить элемент в файл XML так, чтобы он записался в сам XML-файл?
Всем привет! Подскажите, может ли как-то javascript добавить элемент в файл XML так, чтобы он...

5
$ su
1604 / 519 / 97
Регистрация: 18.11.2010
Сообщений: 2,807
Записей в блоге: 2
10.12.2014, 21:23 2
попробуй сначала в массив запихнуть построчно, и потом построчно выведи в файл, авось поможет.
0
Заблокирован
10.12.2014, 22:11 3
Лучший ответ Сообщение было отмечено МихаилНовопашин как решение

Решение

МихаилНовопашин, а не проще использовать XDocument?
C#
1
using System.Xml.Linq;
C#
1
XDocument. Load(@"http://xml.weather.co.ua/1.2/forecast/27?dayf=5&userid=fdsf_com_ua&lang=ru").Save("newxml.xml");
1
Администратор
Эксперт .NET
13998 / 11355 / 4599
Регистрация: 17.03.2014
Сообщений: 22,962
Записей в блоге: 1
10.12.2014, 22:28 4
Лучший ответ Сообщение было отмечено МихаилНовопашин как решение

Решение

МихаилНовопашин, попробовал твой код и не увидел никаких "нарушений структуры". Сохраненный файл полностью совпадает с оригиналом. Ты возможно сравнивал файл на диске с тем что тебе показывает браузер. Совет - открой исходник страницы и ты увидишь настоящее форматирование.

Данный код я, тем не менее, переписал бы т.к. использование StreamReader/StreamWriter делает неявные предположения относительно кодировок и это может привести к проблемам. Безопаснее писать данный в файл как байты.
C#
1
2
3
4
5
6
7
8
9
WebRequest request = WebRequest.Create(@"http://xml.weather.co.ua/1.2/forecast/27?dayf=5&userid=fdsf_com_ua&lang=ru");
using (var response = request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
{
    using (FileStream outputStream = File.OpenWrite("weather.xml"))
    {
        responseStream.CopyTo(outputStream);
    }
}
1
4 / 4 / 0
Регистрация: 28.06.2013
Сообщений: 24
11.12.2014, 10:38  [ТС] 5
Помогите разобраться, почему таким образом ничего не записывается в файл. Версия .NET 2.0 метода CopyTo нет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static void Main(string[] args)
        {
            //XDocument.Load(@"http://xml.weather.co.ua/1.2/forecast/27?dayf=5&userid=fdsf_com_ua&lang=ru").Save("newxml.xml");
 
            WebRequest request = WebRequest.Create(@"http://xml.weather.co.ua/1.2/forecast/27?dayf=5&userid=fdsf_com_ua&lang=ru");
            using (var response = request.GetResponse())
            using (Stream responseStream = response.GetResponseStream())
            {
                using (FileStream outputStream = new FileStream("weather1.xml", FileMode.OpenOrCreate))
                {
                    outputStream.Write(ReadFully(responseStream), 0, ReadFully(responseStream).Length);
                }
            }
        }
 
        public static byte[] ReadFully(Stream input)
        {
            byte[] buffer = new byte[16 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }

Надо было так!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static void Main(string[] args)
        {
            //XDocument.Load(@"http://xml.weather.co.ua/1.2/forecast/27?dayf=5&userid=fdsf_com_ua&lang=ru").Save("newxml.xml");
 
            WebRequest request = WebRequest.Create(@"http://xml.weather.co.ua/1.2/forecast/27?dayf=5&userid=fdsf_com_ua&lang=ru");
            using (var response = request.GetResponse())
            using (Stream responseStream = response.GetResponseStream())
            {
                using (FileStream outputStream = new FileStream("weather1.xml", FileMode.OpenOrCreate))
                {
                    byte[] arr = ReadFully(responseStream);
                    outputStream.Write(arr, 0, arr.Length);
                }
            }
        }
 
        public static byte[] ReadFully(Stream input)
        {
            byte[] buffer = new byte[16 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }
0
Администратор
Эксперт .NET
13998 / 11355 / 4599
Регистрация: 17.03.2014
Сообщений: 22,962
Записей в блоге: 1
11.12.2014, 12:08 6
Лучший ответ Сообщение было отмечено МихаилНовопашин как решение

Решение

Цитата Сообщение от МихаилНовопашин Посмотреть сообщение
Надо было так!
Чтение файла целиком в память подойдет для сравнительно небольших файлов. Правильнее читать и записывать блоками для минимизации расхода памяти:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private static void CopyStream(Stream source, Stream destination)
{
    if (destination == null) throw new ArgumentNullException("destination");
    if (!source.CanRead && !source.CanWrite) throw new ObjectDisposedException("source");
    if (!destination.CanRead && !destination.CanWrite) throw new ObjectDisposedException("destination");
    if (!source.CanRead) throw new NotSupportedException("Source stream doesn't support reading");
    if (!destination.CanWrite) throw new NotSupportedException("Destination stream doesn't support writing");
 
    byte[] buffer = new byte[16384];
    int count;
    while ((count = source.Read(buffer, 0, buffer.Length)) != 0)
    {
        destination.Write(buffer, 0, count);
    }
}
Ты мог бы сделать тоже самое изучив исходники метода CopyTo.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2014, 12:08

[XML] - Как правильно сохранить XML с уровнями и отступами?
Приветы всем. Подскажите как правильно сохранить файл .xml чтобы сохранились отступы в уровнях и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru