Вывод всех элементов XElements

122
11 ноября 2019, 01:00

Имею XML с сложной структурой (CommerceML) и нужно выпарсить некоторые значения оттуда.

К примеру, получаю значения так:

var importFile = XDocument.Load("import/import.xml");
var modelElement = importFile.Element("КоммерческаяИнформация").Element("Каталог")
    .Element("Товары");
var models = modelElement.Descendants("Товар")
    .Select(s => new
    {
        name = s.Element("Наименование").Value,
        id=s.Element("Ид").Value,
        options = s.Element("ЗначенияСвойств")?.Elements("ЗначенияСвойства").Elements("Значение")
    });
var str = new StreamWriter("items.txt");
foreach (var model in models)
{
    str.WriteLine(model.id);
    str.WriteLine(model.name);
    str.WriteLine(model.options);
    str.WriteLine("-----------");
}
str.Close();

В option записываются множественные значения вида:

<ЗначенияСвойств>
    <ЗначенияСвойства>
        <Ид>eb7b1638-5e47-11e2-9059-002590640ee1</Ид>
        <Значение>нет</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>cb031671-4f35-11e7-9400-00155d30fd2b</Ид>
        <Значение>30 кг</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>afdfec66-107a-11e3-83e3-002590a3520f</Ид>
        <Значение>10 ч</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd87-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>85 см</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>c66b051e-5bc4-11e2-9bfe-002590640ee1</Ид>
        <Значение>1 год</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd8b-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>58 см</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd75-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>177 кВт-ч/год</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>eb7b1634-5e47-11e2-9059-002590640ee1</Ид>
        <Значение>нет</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>2d7c5329-c591-11e5-89a8-00155d5d680b</Ид>
        <Значение>нет</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd50-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>свободностоящее</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd77-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>A+</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>06a864d3-597a-11e2-9cb6-002590640ee1</Ид>
        <Значение>N, ST</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>1f1e3ced-f570-11e8-80c0-000c291f7f49</Ид>
        <Значение>нет</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd62-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>1</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd83-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>4</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>4d64983a-e950-11e8-80bf-000c291f7f49</Ид>
        <Значение>морозильник</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>2d7c5358-c591-11e5-89a8-00155d5d680b</Ид>
        <Значение>4 кг/сут</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>bee2b197-5985-11e2-9cb6-002590640ee1</Ид>
        <Значение>92 л</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>bee2b198-5985-11e2-9cb6-002590640ee1</Ид>
        <Значение>92 л</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>1db760f7-f576-11e8-80c0-000c291f7f49</Ид>
        <Значение>нет</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>2d7c530a-c591-11e5-89a8-00155d5d680b</Ид>
        <Значение>есть</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>4cd8e65a-d091-11e5-887f-00155d5d680b</Ид>
        <Значение>85 л</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>4cd8e669-d091-11e5-887f-00155d5d680b</Ид>
        <Значение>85 л</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>4cd8e6a7-d091-11e5-887f-00155d5d680b</Ид>
        <Значение>снаружи</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>afdfec63-107a-11e3-83e3-002590a3520f</Ид>
        <Значение>встроенные</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>3065fb76-596b-11e2-9cb6-002590640ee1</Ид>
        <Значение>нет</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>275b88e2-c591-11e5-89a8-00155d5d680b</Ид>
        <Значение>без No Frost</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>56209cd1-38a0-11e3-8dfd-002590a3520f</Ид>
        <Значение>10 лет</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd85-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>нет</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>27a475fb-c104-11e5-b793-00155d5d680b</Ид>
        <Значение>механическое</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd79-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>42 дБ</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>4f9ea9bd-a721-11e2-ab4e-002590640ee1</Ид>
        <Значение>R600a (изобутан)</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>5c118c42-c903-11e6-945d-00155d30fd20</Ид>
        <Значение>белый</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>0844cd89-5962-11e2-9cb6-002590640ee1</Ид>
        <Значение>55 см</Значение>
    </ЗначенияСвойства>
</ЗначенияСвойств>

Как мне получить на выходе данные которые содержат Значение? У Elements нет метода Value

Answer 1

Не совсем понятно что вам нужно, но словарь с помощью Linq можно получить так:

var xml = @"<ЗначенияСвойств>
    <ЗначенияСвойства>
        <Ид>eb7b1638-5e47-11e2-9059-002590640ee1</Ид>
        <Значение>нет</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>cb031671-4f35-11e7-9400-00155d30fd2b</Ид>
        <Значение>30 кг</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>afdfec66-107a-11e3-83e3-002590a3520f</Ид>
        <Значение>10 ч</Значение>
    </ЗначенияСвойства>
    ...
</ЗначенияСвойств>";
var root = XElement.Parse(xml);
var dict = root.Elements("ЗначенияСвойства")
    .ToDictionary(e => e.Element("Ид").Value, e => e.Element("Значение").Value);
Console.WriteLine(dict["2d7c5358-c591-11e5-89a8-00155d5d680b"]);
READ ALSO
Roslyn ошибка сборки System.Runtime

Roslyn ошибка сборки System.Runtime

Коллеги, добрый день!

119
Sql запрос с параметрами в цикле для добавления данных в базу

Sql запрос с параметрами в цикле для добавления данных в базу

Сделал такую конструкцию, для добавления данных в базу, вопрос, Правильно ли написан запрос, и если учитывать то, что это цикл, будет ли эффективным...

129
Алгоритм работы Windows аутентификации в веб

Алгоритм работы Windows аутентификации в веб

Как работает в Windows аутентификации в вебе

123