2

Пасирую данные из файла и записую модель и делаю измения:Удаляю,дабавляю продукты.

Модель SellerModel

class SellerModel : ChangeProperty
    {
        string name { get; set; }
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }
    string сompany { get; set; }
    public string Company
    {
        get { return сompany; }
        set
        {
            сompany = value;
            OnPropertyChanged("Company");
        }
    }
    string url { get; set; }
    public string Url
    {
        get { return url; }
        set
        {
            url = value;
            OnPropertyChanged("Url");
        }
    }
    string date { get; set; }
    public string Date
    {
        get { return date; }
        set
        {
            date = value;
            OnPropertyChanged("Date");
        }
    }
    public ObservableCollection<CategoryModel> Сategories { get; set; }
    public ObservableCollection<CurrencyModel> Currencies { get; set; }
    public ObservableCollection<OfferModel> Offers { get; set; }


    public SellerModel()
    {
        Сategories = new ObservableCollection<CategoryModel>();
        Currencies = new ObservableCollection<CurrencyModel>();
        Offers = new ObservableCollection<OfferModel>();
    }

} 

OfferModel

class OfferModel:ChangeProperty
    {
        string url { get; set; }
        public string Url
        {
            get { return url; }
            set
            {
                url = value;
                OnPropertyChanged("Url");
            }
        }
    decimal price { get; set; }
    public decimal Price
    {
        get { return price; }
        set
        {
            price = value;
            OnPropertyChanged("Price");
        }
    }

    string currencyId { get; set; }
    public string CurrencyId
    {
        get { return currencyId; }
        set
        {
            currencyId = value;
            OnPropertyChanged("CurrencyId");
        }
    }

    int categoryId { get; set; }
    public int CategoryId
    {
        get { return categoryId; }
        set
        {
            categoryId = value;
            OnPropertyChanged("CategoryId");
        }
    }

    public ObservableCollection<string> Picture { get; set; } = new ObservableCollection<string>();

    string name { get; set; }
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }
    string vendor { get; set; }
    public string Vendor
    {
        get { return vendor; }
        set
        {
            vendor = value;
            OnPropertyChanged("Vendor");
        }
    }
    public ObservableCollection<DescriptionModel> Descriptions { get; set; } = new ObservableCollection<DescriptionModel>();
    public ObservableCollection<ParamModel> Param { get; set; } = new ObservableCollection<ParamModel>();

    int stock_quantity { get; set; }
    public int Stock_quantity
    {
        get { return stock_quantity; }
        set
        {
            stock_quantity = value;
            OnPropertyChanged("Stock_quantity");
        }
    }

    bool аvailable { get; set; }
    public bool Available
    {
        get { return аvailable; }
        set
        {
            аvailable = value;
            OnPropertyChanged("Available");
        }
    }

    int id { get; set; }
    public int Id
    {
        get { return id; }
        set
        {
            id = value;
            OnPropertyChanged("Id");
        }
    }

    public OfferModel(){}
    public OfferModel(string url, decimal price, string currencyId, int categoryId, string name, string vendor, int stock_quantity, bool available, int id)
    {
        Url = url;
        Price = price;
        CurrencyId = currencyId;
        CategoryId = categoryId;
        Name = name;
        Vendor = vendor;
        Stock_quantity = stock_quantity;
        Available = available;
        Id = id;
    }

}

DescriptionModel

class DescriptionModel:ChangeProperty
    {
        string text { get; set; }
        public string Text
        {
            get { return text; }
            set 
            {
                text = value;
                OnPropertyChanged("Text");
            }
        }
    public DescriptionModel() { }

    public DescriptionModel(string text)
    {
        Text = text;
    }

}

Файл XML

<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog date="2018-05-23 12:00">
    <shop>
        <name>Кальченко Юрий</name>
        <company>ГАЛС-С</company>
        <url>http://www.leoton.ua/</url>
        <currencies>
            <currency id="UAH" rate="1" />
        </currencies>
        <categories>
            <category id="1">Солнечные электростанции</category><!--Автономный инвертор ХТ (1.5кВт-10.0кВт)--> 
            <category id="2">Источники бесперебойного питания</category>
            <category id="3">Измерительная техника</category><!--MPPT Контроллер заряда ИМПУЛЬС-3010S)-->
            <category id="4">Пускозарядные устройства</category>
        </categories>
        <offers>
            <offer available="true" id="3001">
                <url>http://www.leoton.ua/ups-mx1-online.php</url>
                <price>6720</price>
                <currencyId>UAH</currencyId>
                <categoryId>2</categoryId>
                <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
                <name>Источники бесперебойного питания MX (MX1)</name>
                <vendor>ГАЛС-С</vendor>
                <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
                <param name="Напряжение АКБ, V">12V</param>
                <param name="Мощность, кВт">0.5 кВт</param>
                <param name="Пиковая мощность, кВт">0.8 кВт</param>
                <param name="Зарядное устройство, А">до 50 А</param>
                <param name="Страна-производитель">Украина</param>
                <param name="Гарантия">1 год</param>
                <stock_quantity>100</stock_quantity>
            </offer>
            <offer available="true" id="3002">
                <url>http://www.leoton.ua/ups-mx2-12-online.php</url>
                <price>11040</price>
                <currencyId>UAH</currencyId>
                <categoryId>2</categoryId>
                <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
                <name>Источники бесперебойного питания MX (MX2-12)</name>
                <vendor>ГАЛС-С</vendor>
                <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
                <param name="Напряжение АКБ, V">12V</param>
                <param name="Мощность, кВт">1.0 кВт</param>
                <param name="Пиковая мощность, кВт">1.5 кВт</param>
                <param name="Зарядное устройство, А">до 90 А</param>
                <param name="Страна-производитель">Украина</param>
                <param name="Гарантия">1 год</param>
                <stock_quantity>100</stock_quantity>
            </offer>
            <offer available="true" id="3003">
                <url>http://www.leoton.ua/ups-mx2-online.php</url>
                <price>11040</price>
                <currencyId>UAH</currencyId>
                <categoryId>2</categoryId>
                <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
                <name>Источники бесперебойного питания MX (MX2-24)</name>
                <vendor>ГАЛС-С</vendor>
                <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
                <param name="Напряжение АКБ, V">24V</param>
                <param name="Мощность, кВт">1.3 кВт</param>
                <param name="Пиковая мощность, кВт">1.7 кВт</param>
                <param name="Зарядное устройство, А">до 50 А</param>
                <param name="Страна-производитель">Украина</param>
                <param name="Гарантия">1 год</param>
                <stock_quantity>100</stock_quantity>
            </offer>
            <offer available="true" id="3004">
                <url>http://www.leoton.ua/ups-mx2-online-48v.php</url>
                <price>11040</price>
                <currencyId>UAH</currencyId>
                <categoryId>2</categoryId>
                <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
                <name>Источники бесперебойного питания MX (MX2-48)</name>
                <vendor>ГАЛС-С</vendor>
                <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
                <param name="Напряжение АКБ, V">48V</param>
                <param name="Мощность, кВт">1.4 кВт</param>
                <param name="Пиковая мощность, кВт">1.7 кВт</param>
                <param name="Зарядное устройство, А">до 40 А</param>
                <param name="Страна-производитель">Украина</param>
                <param name="Гарантия">1 год</param>
                <stock_quantity>100</stock_quantity>
            </offer>
            <offer available="true" id="3005">
                <url>http://www.leoton.ua/ups-mx3-24v-online.php</url>
                <price>19920</price>
                <currencyId>UAH</currencyId>
                <categoryId>2</categoryId>
                <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
                <name>Источники бесперебойного питания MX (MX3-24)</name>
                <vendor>ГАЛС-С</vendor>
                <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
                <param name="Напряжение АКБ, V">24V</param>
                <param name="Мощность, кВт">2.2 кВт</param>
                <param name="Пиковая мощность, кВт">13.6 кВт</param>
                <param name="Зарядное устройство, А">до 90 А</param>
                <param name="Страна-производитель">Украина</param>
                <param name="Гарантия">1 год</param>
                <stock_quantity>100</stock_quantity>
            </offer>
            <offer available="true" id="3006">
                <url>http://www.leoton.ua/ups-mx3-online.php</url>
                <price>19020</price>
                <currencyId>UAH</currencyId>
                <categoryId>2</categoryId>
                <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
                <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
                <name>Источники бесперебойного питания MX (MX3-48)</name>
                <vendor>ГАЛС-С</vendor>
                <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
                <param name="Напряжение АКБ, V">48V</param>
                <param name="Мощность, кВт">2.2 кВт</param>
                <param name="Пиковая мощность, кВт">13.6 кВт</param>
                <param name="Зарядное устройство, А">до 50 А</param>
                <param name="Страна-производитель">Украина</param>
                <param name="Гарантия">1 год</param>
                <stock_quantity>100</stock_quantity>
            </offer>
        &lt;offer available=&quot;true&quot; id=&quot;3006&quot;&gt;
            &lt;url&gt;http://www.leoton.ua/ups-mx3-online.php&lt;/url&gt;
            &lt;price&gt;19020&lt;/price&gt;
            &lt;currencyId&gt;UAH&lt;/currencyId&gt;
            &lt;categoryId&gt;4&lt;/categoryId&gt;
            &lt;picture&gt;http://www.leoton.ua/images/mx/mx-1.jpg&lt;/picture&gt;
            &lt;picture&gt;http://www.leoton.ua/images/mx/mx-2.jpg&lt;/picture&gt;
            &lt;picture&gt;http://www.leoton.ua/images/mx/mx-3.jpg&lt;/picture&gt;
            &lt;picture&gt;http://www.leoton.ua/images/mx/mx-4.jpg&lt;/picture&gt;
            &lt;name&gt;ggg (MX3-48)&lt;/name&gt;
            &lt;vendor&gt;ГАЛС-С&lt;/vendor&gt;
            &lt;description&gt;&lt;![CDATA[
            &lt;p&gt;ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.&lt;/p&gt;
            &lt;p&gt;ON-Line&lt;/p&gt;
            &lt;p&gt;•Для серверов и телекоммуникационного оборудования&lt;/p&gt;
            &lt;p&gt;•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры&lt;/p&gt;
            &lt;p&gt;•Для газовых котлов всех типов&lt;/p&gt;
            &lt;p&gt;•Для Кофе-машин и бытовой аппаратуры&lt;/p&gt;]]&gt;&lt;/description&gt;
            &lt;param name=&quot;Напряжение АКБ, V&quot;&gt;48V&lt;/param&gt;
            &lt;param name=&quot;Мощность, кВт&quot;&gt;2.2 кВт&lt;/param&gt;
            &lt;param name=&quot;Пиковая мощность, кВт&quot;&gt;13.6 кВт&lt;/param&gt;
            &lt;param name=&quot;Зарядное устройство, А&quot;&gt;до 50 А&lt;/param&gt;
            &lt;param name=&quot;Страна-производитель&quot;&gt;Украина&lt;/param&gt;
            &lt;param name=&quot;Гарантия&quot;&gt;1 год&lt;/param&gt;
            &lt;stock_quantity&gt;100&lt;/stock_quantity&gt;
        &lt;/offer&gt;
    &lt;/offers&gt;
&lt;/shop&gt;

</yml_catalog>

Проблема: Нужно все данные из Модели SellerModel записать в сгенерированный файл и сохранить куда пользователь хочет. Как я это выжу:

1.Переливаные данных из Модели SellerModel в новые классы для серезицазации(очень плохой вариант).

2.Как-то подставить данные в файл из Модели SellerModel при генерации файла:

<name>${Name}</name>

Как должен выглядеть сгенерированный файл пример внизу,он выглядит как старый но с новыми данными и другая дата генерации date="2018-05-23 12:00".

<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog date="Указывает дату и время генерации или изменения XML">
    <shop>
        <name>Название магазина</name>
        <company>Наименование компании</company>
        <url>URL главной страницы существующего магазина.</url>
        <currencies>
            <currency id="Валюта" rate="1" />
        </currencies>
        <categories>
            <category id="Каждой категории присваиваться уникальный номер.">Список категорий магазина.</category>
        </categories>
        <offers>
            <offer available="указывает наличие товара" id="каждому предложению необходимо присвоить уникальный номер ">
                <url>URL главной страницы существующего магазина.</url>
                <price>Цена товара.</price>
                <currencyId>Валюта</currencyId>
                <categoryId>уникальный номер категории </categoryId>
                <picture>Ссылка на фото товара.</picture>
                <name>Короткое название магазина.</name>
                <vendor>Бренд-производитель товара.</vendor>
                <description><![CDATA[<p>Описание товара</p>]]></description>
                <param name="Характеристики">значение характеристики</param>
                <stock_quantity>Товар будет в наличии на сайте.</stock_quantity>
            </offer>
    &lt;/offers&gt;
&lt;/shop&gt;

</yml_catalog>

Результат

<?xml version="1.0" encoding="utf-8"?>
<yml_catalog date="6/20/2020 2:56:36 PM">
  <shop>
    <name>Кальченко Гена</name>
    <company>ГАЛС-С</company>
    <url>http://www.leoton.ua/</url>
    <currencies>
      <currency id="UAH" rate="1" />
      <currency id="$" rate="2" />
    </currencies>
    <categories>
      <category id="1">Солнечные электростанции</category>
      <category id="2">Источники бесперебойного питания</category>
      <category id="3">Измерительная техника</category>
      <category id="4">Пускозарядные устройства</category>
      <category id="5">d</category>
    </categories>
    <offers>
      <offer available="true" id="13">
        <url>http://www.leoton.ua/ups-mx1-online.php</url>
        <price>6720</price>
        <currencyId>UAH</currencyId>
        <categoryId>2</categoryId>
        <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
        <name>Источники бесперебойного питания MX (MX1)</name>
        <vendor>ГАЛС-С</vendor>
        <description><![CDATA[<p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
<p>ON-Line</p>
<p>•Для серверов и телекоммуникационного оборудования</p>
<p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
<p>•Для газовых котлов всех типов</p>
<p>•Для Кофе-машин и бытовой аппаратуры</p>
]]></description>
        <param name="Напряжение АКБ, V">12V</param>
        <param name="Мощность, кВт">0.5 кВт</param>
        <param name="Пиковая мощность, кВт">0.8 кВт</param>
        <param name="Зарядное устройство, А">до 50 А</param>
        <param name="Страна-производитель">Украина</param>
        <param name="Гарантия">1 год</param>
        <stock_quantity>10</stock_quantity>
      </offer>
      <offer available="true" id="33">
        <url>http://www.leoton.ua/ups-mx2-12-online.php</url>
        <price>11040</price>
        <currencyId>UAH</currencyId>
        <categoryId>1</categoryId>
        <picture>http://www.leoton.ua/images/mx/4343.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/3434.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/3434.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/3443.jpg</picture>
        <name>Источники бесперебойного питания MX (MX2-12)</name>
        <vendor>ГАЛС-С</vendor>
        <description><![CDATA[<p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
<p>ON-Line</p>
<p>•Для серверов и телекоммуникационного оборудования</p>
<p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
<p>•Для газовых котлов всех типов</p>
<p>•Для Кофе-машин и бытовой аппаратуры</p>
]]></description>
        <param name="Напряжение АКБ, V">30V</param>
        <param name="Мощность, кВт">4.0 кВт</param>
        <param name="Пиковая мощность, кВт">5.5 кВт</param>
        <param name="Зарядное устройство, А">до 93434 А</param>
        <param name="Страна-производитель">Украина</param>
        <param name="Гарантия">3 год</param>
        <stock_quantity>99</stock_quantity>
      </offer>
    </offers>
  </shop>
</yml_catalog
Vladimir
  • 403
  • У вас русский язык не родной? Очень своебразно пишете текст. – tym32167 Jun 17 '20 at 16:58
  • Вывод чего бы то ни было в XML - это функция, которая не имеет отношения к MVVM вообще, ни к моделям MVVM. Я предпочитаю писать для этого отдельные классы и модели. – tym32167 Jun 17 '20 at 16:59
  • Как я понял написать отдельные классы подходящие под структуру файла и передать туда данные из Seller Model? – Vladimir Jun 17 '20 at 17:20
  • да, я бы сделал так. То есть 1) Написал бы модели для XML с данными, что я хочу сохранить в XML 2) Класс, который мапит MVVM модели на модели для XML, класс, который принимает модели для XML и выдает сериализованный Stream или String, и класс который принимает путь к файлу, Stream или String и пишет этот Stream или String в файл – tym32167 Jun 17 '20 at 17:23
  • @Vladimir, Почему бы не использовать XSLT-преобразование для создания желаемого выходного файла XML? – Yitzhak Khabinsky Jun 17 '20 at 17:31
  • @Yitzhak Khabinsky я не знаю что это XSLT,можете дать пример?? – Vladimir Jun 17 '20 at 17:39
  • Покажите код, как вы из XML данные загружаете, я пока не понимаю, почему у вас не получается выполнить обратный процесс. Вы в курсе, что такое сериализация и десереализация? – aepot Jun 17 '20 at 17:43
  • @aepot да знаю что такое сериализация и десереализация.Если я не знал как я получил данные из XML файла? – Vladimir Jun 17 '20 at 17:50
  • Следовательно вы знаете, как их туда записать. Сериализация и десереализация это обратимые процессы, которые друг друга обращают. – aepot Jun 17 '20 at 17:51
  • @Vladimir, XSLT-преобразование будет обрабатывать входной XML-файл для генерации желаемого выходного XML-файла. Входной XML + XSLT = Выходной XML. – Yitzhak Khabinsky Jun 17 '20 at 18:04
  • XSLT не нужен. Говорю это как человек, написавший множество трансформаций. Преобразование XML с помощью C# намного проще (и работает быстрее). И любой джуниор потом код поддерживать сможет. – Alexander Petrov Jun 17 '20 at 18:27
  • Я написал классы специальные под мою задачу но есть проблема я ее расписал внизу в ответе. – Vladimir Jun 19 '20 at 14:01

1 Answers1

1

Я просто покажу пример сериализации и десереализации.

Иду на сайт https://xmltocsharp.azurewebsites.net/ - Xml2Csharp.com Converter. Вставляю туда, ваш XML, получаю почти готовый код классов.

Путем нескольких доработок, спустя 5 минут, получаю вполне рабочий код для хранения данных:

[XmlRoot("currency")]
public class Currency
{
    [XmlAttribute("id")]
    public string Id { get; set; }
    [XmlAttribute("rate")]
    public string Rate { get; set; }
}

[XmlRoot("currencies")] public class Currencies { [XmlElement("currency")] public Currency Currency { get; set; } }

[XmlRoot("category")] public class Category { [XmlAttribute("id")] public string Id { get; set; } [XmlText] public string Text { get; set; } }

[XmlRoot("categories")] public class Categories { [XmlElement("category")] public List<Category> Category { get; set; } }

[XmlRoot("param")] public class Param { [XmlAttribute("name")] public string Name { get; set; } [XmlText] public string Text { get; set; } }

[XmlRoot("offer")] public class Offer { private string _description;

[XmlElement(&quot;url&quot;)]
public string Url { get; set; }
[XmlElement(&quot;price&quot;)]
public int Price { get; set; }
[XmlElement(&quot;currencyId&quot;)]
public string CurrencyId { get; set; }
[XmlElement(&quot;categoryId&quot;)]
public string CategoryId { get; set; }
[XmlElement(&quot;picture&quot;)]
public List&lt;string&gt; Picture { get; set; }
[XmlElement(&quot;name&quot;)]
public string Name { get; set; }
[XmlElement(&quot;vendor&quot;)]
public string Vendor { get; set; }
[XmlElement(&quot;description&quot;)]
public XmlCDataSection Description
{
    get =&gt; new XmlDocument().CreateCDataSection(_description);
    set =&gt; _description = value.Value;
}
[XmlElement(&quot;param&quot;)]
public List&lt;Param&gt; Param { get; set; }
[XmlElement(&quot;stock_quantity&quot;)]
public int StockQuantity { get; set; }
[XmlAttribute(&quot;available&quot;)]
public string Available { get; set; }
[XmlAttribute(&quot;id&quot;)]
public string Id { get; set; }

}

[XmlRoot("offers")] public class Offers { [XmlElement("offer")] public List<Offer> Offer { get; set; } }

[XmlRoot("shop")] public class Shop { [XmlElement("name")] public string Name { get; set; } [XmlElement("company")] public string Company { get; set; } [XmlElement("url")] public string Url { get; set; } [XmlElement("currencies")] public Currencies Currencies { get; set; } [XmlElement("categories")] public Categories Categories { get; set; } [XmlElement("offers")] public Offers Offers { get; set; } }

[XmlRoot("yml_catalog")] public class YmlCatalog { [XmlElement("shop")] public Shop Shop { get; set; } [XmlAttribute("date")] public string Date { get; set; } }

Читать данные можно так

YmlCatalog catalog;
using (StreamReader sr = new StreamReader("catalog.xml"))
{
    XmlSerializer serializer = new XmlSerializer(typeof(YmlCatalog));
    catalog = (YmlCatalog)serializer.Deserialize(sr);
}

С данными можно работать

foreach (Offer offer in catalog.Shop.Offers.Offer)
{
    Console.WriteLine(offer.Name);
}

Кажется, работает

Источники бесперебойного питания MX (MX1)
Источники бесперебойного питания MX (MX2-12)
Источники бесперебойного питания MX (MX2-24)
Источники бесперебойного питания MX (MX2-48)
Источники бесперебойного питания MX (MX3-24)
Источники бесперебойного питания MX (MX3-48)
ggg (MX3-48)

Писать в файл можно вот так

using (StreamWriter sw = new StreamWriter("catalog_out.xml"))
{
    XmlSerializer serializer = new XmlSerializer(typeof(YmlCatalog));
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");
    serializer.Serialize(sw, catalog, ns);
}

Ну и вот "как есть" xml файл, записанный из данных в классах методом записи, показанным выше. Как говорится, найдите все отличия. :) Они есть, но на качество данных не влияют.

<?xml version="1.0" encoding="utf-8"?>
<yml_catalog date="2018-05-23 12:00">
  <shop>
    <name>Кальченко Юрий</name>
    <company>ГАЛС-С</company>
    <url>http://www.leoton.ua/</url>
    <currencies>
      <currency id="UAH" rate="1" />
    </currencies>
    <categories>
      <category id="1">Солнечные электростанции</category>
      <category id="2">Источники бесперебойного питания</category>
      <category id="3">Измерительная техника</category>
      <category id="4">Пускозарядные устройства</category>
    </categories>
    <offers>
      <offer available="true" id="3001">
        <url>http://www.leoton.ua/ups-mx1-online.php</url>
        <price>6720</price>
        <currencyId>UAH</currencyId>
        <categoryId>2</categoryId>
        <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
        <name>Источники бесперебойного питания MX (MX1)</name>
        <vendor>ГАЛС-С</vendor>
        <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
        <param name="Напряжение АКБ, V">12V</param>
        <param name="Мощность, кВт">0.5 кВт</param>
        <param name="Пиковая мощность, кВт">0.8 кВт</param>
        <param name="Зарядное устройство, А">до 50 А</param>
        <param name="Страна-производитель">Украина</param>
        <param name="Гарантия">1 год</param>
        <stock_quantity>100</stock_quantity>
      </offer>
      <offer available="true" id="3002">
        <url>http://www.leoton.ua/ups-mx2-12-online.php</url>
        <price>11040</price>
        <currencyId>UAH</currencyId>
        <categoryId>2</categoryId>
        <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
        <name>Источники бесперебойного питания MX (MX2-12)</name>
        <vendor>ГАЛС-С</vendor>
        <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
        <param name="Напряжение АКБ, V">12V</param>
        <param name="Мощность, кВт">1.0 кВт</param>
        <param name="Пиковая мощность, кВт">1.5 кВт</param>
        <param name="Зарядное устройство, А">до 90 А</param>
        <param name="Страна-производитель">Украина</param>
        <param name="Гарантия">1 год</param>
        <stock_quantity>100</stock_quantity>
      </offer>
      <offer available="true" id="3003">
        <url>http://www.leoton.ua/ups-mx2-online.php</url>
        <price>11040</price>
        <currencyId>UAH</currencyId>
        <categoryId>2</categoryId>
        <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
        <name>Источники бесперебойного питания MX (MX2-24)</name>
        <vendor>ГАЛС-С</vendor>
        <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
        <param name="Напряжение АКБ, V">24V</param>
        <param name="Мощность, кВт">1.3 кВт</param>
        <param name="Пиковая мощность, кВт">1.7 кВт</param>
        <param name="Зарядное устройство, А">до 50 А</param>
        <param name="Страна-производитель">Украина</param>
        <param name="Гарантия">1 год</param>
        <stock_quantity>100</stock_quantity>
      </offer>
      <offer available="true" id="3004">
        <url>http://www.leoton.ua/ups-mx2-online-48v.php</url>
        <price>11040</price>
        <currencyId>UAH</currencyId>
        <categoryId>2</categoryId>
        <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
        <name>Источники бесперебойного питания MX (MX2-48)</name>
        <vendor>ГАЛС-С</vendor>
        <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
        <param name="Напряжение АКБ, V">48V</param>
        <param name="Мощность, кВт">1.4 кВт</param>
        <param name="Пиковая мощность, кВт">1.7 кВт</param>
        <param name="Зарядное устройство, А">до 40 А</param>
        <param name="Страна-производитель">Украина</param>
        <param name="Гарантия">1 год</param>
        <stock_quantity>100</stock_quantity>
      </offer>
      <offer available="true" id="3005">
        <url>http://www.leoton.ua/ups-mx3-24v-online.php</url>
        <price>19920</price>
        <currencyId>UAH</currencyId>
        <categoryId>2</categoryId>
        <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
        <name>Источники бесперебойного питания MX (MX3-24)</name>
        <vendor>ГАЛС-С</vendor>
        <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
        <param name="Напряжение АКБ, V">24V</param>
        <param name="Мощность, кВт">2.2 кВт</param>
        <param name="Пиковая мощность, кВт">13.6 кВт</param>
        <param name="Зарядное устройство, А">до 90 А</param>
        <param name="Страна-производитель">Украина</param>
        <param name="Гарантия">1 год</param>
        <stock_quantity>100</stock_quantity>
      </offer>
      <offer available="true" id="3006">
        <url>http://www.leoton.ua/ups-mx3-online.php</url>
        <price>19020</price>
        <currencyId>UAH</currencyId>
        <categoryId>2</categoryId>
        <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
        <name>Источники бесперебойного питания MX (MX3-48)</name>
        <vendor>ГАЛС-С</vendor>
        <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
        <param name="Напряжение АКБ, V">48V</param>
        <param name="Мощность, кВт">2.2 кВт</param>
        <param name="Пиковая мощность, кВт">13.6 кВт</param>
        <param name="Зарядное устройство, А">до 50 А</param>
        <param name="Страна-производитель">Украина</param>
        <param name="Гарантия">1 год</param>
        <stock_quantity>100</stock_quantity>
      </offer>
      <offer available="true" id="3006">
        <url>http://www.leoton.ua/ups-mx3-online.php</url>
        <price>19020</price>
        <currencyId>UAH</currencyId>
        <categoryId>4</categoryId>
        <picture>http://www.leoton.ua/images/mx/mx-1.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-2.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-3.jpg</picture>
        <picture>http://www.leoton.ua/images/mx/mx-4.jpg</picture>
        <name>ggg (MX3-48)</name>
        <vendor>ГАЛС-С</vendor>
        <description><![CDATA[
                <p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
                <p>ON-Line</p>
                <p>•Для серверов и телекоммуникационного оборудования</p>
                <p>•Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</p>
                <p>•Для газовых котлов всех типов</p>
                <p>•Для Кофе-машин и бытовой аппаратуры</p>]]></description>
        <param name="Напряжение АКБ, V">48V</param>
        <param name="Мощность, кВт">2.2 кВт</param>
        <param name="Пиковая мощность, кВт">13.6 кВт</param>
        <param name="Зарядное устройство, А">до 50 А</param>
        <param name="Страна-производитель">Украина</param>
        <param name="Гарантия">1 год</param>
        <stock_quantity>100</stock_quantity>
      </offer>
    </offers>
  </shop>
</yml_catalog>

Отвечая на второй ваш вопрос, как сделать описание в CDATA в формате HTML по спецификации на сайте магазина.

  1. Модифицируйте DescriptionModel
public class DescriptionModel : ChangeProperty
{
    private string text { get; set; }
    private ObservableCollection<string> features = new ObservableCollection<string>();
    public string Text
    {
        get { return text; }
        set
        {
            text = value;
            OnPropertyChanged(nameof(Text));
        }
    }
public ObservableCollection&lt;string&gt; Features
{
    get { return features; }
    set
    {
        features = value;
        OnPropertyChanged(nameof(Features));
    }
}

public DescriptionModel() { }

public DescriptionModel(string text, ObservableCollection&lt;string&gt; features)
{
    Text = text;
    Features = features;
}

}

Что я сделал: добавил список строк Features, он будет служить для генерации выходного HTML списка. Это вместо псевдо-точек в начале строк в вашем примере.

  1. В OfferModel у вас есть коллекция
public ObservableCollection<DescriptionModel> Descriptions { get; set; } = new ObservableCollection<DescriptionModel>();

просто замените ее на класс:

public DescriptionModel { get; set; }
  1. Вот пример добавления в нее данных.
DescriptionModel decription = new DescriptionModel();
decription.Text = "ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.\r\nON-Line";
decription.Features.Add("Для серверов и телекоммуникационного оборудования");
decription.Features.Add("Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры");
decription.Features.Add("Для газовых котлов всех типов");
decription.Features.Add("Для Кофе-машин и бытовой аппаратуры");

Text Многострочный, каждую новую строку будем считать новым параграфом.

  1. И теперь простое преобразование в HTML со списком, не используя внешние библиотеки, а просто вручную.
private string DescriptionToHTML(DescriptionModel decription)
{
    string result = string.Empty;
    foreach (string s in decription.Text.Split("\r\n"))
    {
        result += "<p>" + s + "</p>\r\n";
    }
    if (decription.Features?.Count > 0)
    {
        result += "<ul>\r\n";
        foreach (string s in decription.Features)
        {
            result += "<li>" + s + "</li>\r\n";
        }
        result += "</ul>";
    }
    return result.Trim();
}

И эту функцию можно так использовать:

string html = DescriptionToHTML(decription);
  1. И теперь можно загнать это в XML CDATA
XmlCDataSection xmlDescription = new XmlDocument().CreateCDataSection(html);

Выходной HTML выглядит так:

<p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
<p>ON-Line</p>
<ul>
<li>Для серверов и телекоммуникационного оборудования</li>
<li>Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</li>
<li>Для газовых котлов всех типов</li>
<li>Для Кофе-машин и бытовой аппаратуры</li>
</ul>

CDATA соответственно вот так

<![CDATA[<p>ИБП МХ представляет собой наилучший способ защиты Вашего электрооборудования.</p>
<p>ON-Line</p>
<ul>
<li>Для серверов и телекоммуникационного оборудования</li>
<li>Для Систем ТВ, аудио аппаратуры, ПК и серверов, сетевой аппаратуры</li>
<li>Для газовых котлов всех типов</li>
<li>Для Кофе-машин и бытовой аппаратуры</li>
</ul>]]>
aepot
  • 49,560
  • 1
    Комментарии не предназначены для расширенной дискуссии; разговор перемещён в чат. – Suvitruf - Andrei Apanasik Jun 19 '20 at 18:36
  • В некоторых товаров только

    тег. Спасибо вам за потраченное время.

    – Vladimir Jun 19 '20 at 18:39
  • 1
    @Vladimir так не заполняйте коллецую Features, вносите только многострочный Text, и не будет списка <ul>, будет только <p>. Изучите код метода DescriptionToHTML(), доработайте под себя, если требуется. – aepot Jun 19 '20 at 18:43
  • 1
    Спасибо вы очень помогли мне. – Vladimir Jun 19 '20 at 18:46
  • Я посмотрел и понял не получиться заменить на public DescriptionModel { get; set; } но я суть понял или можно заменить но с делать public ObservableCollection<DescriptionModel> Descriptions { get; set; } в классе DescriptionModel вот какие у меня были с привязкой:[https://ru.stackoverflow.com/questions/1140994/%d0%9f%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d1%8b-%d1%81%d0%b1%d0%be%d1%80%d0%be%d0%bc-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-mvvm](Проблемы сбором данных MVVM) – Vladimir Jun 20 '20 at 10:55
  • @Vladimir все получится, если постараться, и понять как это работает. И вы странно используете команды, те что по ссылке, у вас создается новая команда при обращении к ней. Вот пример, как я использую команды. – aepot Jun 20 '20 at 11:14
  • @Vladimir вам нужно понять, как это все работает, почитайте документацию (1, 2) – aepot Jun 20 '20 at 11:17
  • 1
    @aepot Еще раз огромное спасибо вам за помощь,я все изучу. – Vladimir Jun 20 '20 at 11:22
  • 2
    @aepot: «Иду на сайт https://xmltocsharp.azurewebsites.net/ - Xml2Csharp.com» — есть вроде проще способ: https://i.stack.imgur.com/6u6KM.png – VladD Feb 23 '21 at 21:00