Как получить из тегов xml-файла значения?

112
08 марта 2021, 12:00

Задача — получить из xml-файла все данные из тега offer

Я пробовал получить данные, но оно выдает мне все данные как обычный тест с тегами, а мне нужно получить данные из всех тегов.

<?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="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="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>
        </offers>
    </shop>
</yml_catalog>

C# код

XmlNodeList nodeoffer = xDoc.GetElementsByTagName("offer");
string offer = string.Empty;
foreach (XmlNode node in nodeoffer)  
Console.WriteLine(offer=node.InnerText);
Answer 1

Для вашей задачи использование XmlDocument — не лучший выбор, да и вообще это устаревший способ работы с XML. Если вам нужна большая часть данных из XML — лучше его десериализовать и потом работать уже с полноценными экземплярами классов, если вам из XML нужно извлечь сравнительно малую часть данных — используйте XDocument (это более современная замена XmlDocument, легковесная и с поддержкой LINQ).

Итак, десериализация. Гуглим "xml to c#", открываем первую ссылку: https://xmltocsharp.azurewebsites.net, вставляем в текстовое поле содержимое вашего XML и жмем Convert, полученный результат копируем в отдельный cs-файл, подправляем пространство имен на нужное нам. Можно вместо онлайн-ресурса воспользоваться встроенным в студию инструментом Edit > Paste Special > Paste XML As Classes, но он выдает более громоздкое представление (с backing fields).

Пишем код:

Yml_catalog catalog;
var serializer = new XmlSerializer(typeof(Yml_catalog));
using (var stream = File.OpenRead(path))
    catalog = (Yml_catalog)serializer.Deserialize(stream);
// Модель можно переписать поудачнее,
//  чтобы св-во Offers сразу было коллекцией
// Сделаете это самостоятельно
var offers = catalog.Shop.Offers.Offer;
foreach (var offer in offers)
{
    Console.WriteLine(offer.Url);
    Console.WriteLine(offer.Price);
    Console.WriteLine(offer.CurrencyId);
    ...
}
READ ALSO
ошибки Read only asset Packages

ошибки Read only asset Packages

вылезли ошибки, пробовал пере-импортировать пакеты все сразу и по отдельностиУдалось исправить с 76 до 34 ошибок

118
Perl добавить чекбоксы в БД

Perl добавить чекбоксы в БД

Есть форма с множеством инпутов

114
общие друзья php + mysql

общие друзья php + mysql

подскажите как вывести общих друзей пользователя user и моих twoUser

130
Проект по проверке олимпиад [закрыт]

Проект по проверке олимпиад [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

120