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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2017, 09:14   #1
tomsoer
 
Регистрация: 23.02.2017
Сообщений: 6
Восклицание Linq XML - повторяющийся атрибут

Здравствуйте!
Помогите решить проблему. Есть код:
Код:
            
XDocument doc = new XDocument(
new XElement("Cards",
new XElement("Card", new XAttribute("number", labelCard.Text)),
listarticle.Select(i => new XElement("product", new XAttribute("article", i),
listcount.Select(a => new XAttribute("counts", a))))));
doc.Save(@"../data/report/" + labelCard.Text + ".xml");
Компилятор выдает ошибку на повторяющийся атрибут.

XML должен выглядеть так:
Код:
<?xml version="1.0" encoding="utf-8"?>
<Cards>
  <Card number="555888">
    <product article="..." count="..."/>
    <product article="..." count="..."/>
    <product article="..." count="..."/>
  </Card>
</Cards>
Если просто listcount сократить до new XAttribute и принудительно вписать, то работает.
Код:
XDocument doc = new XDocument(
new XElement("Cards",
new XElement("Card", new XAttribute("number", labelCard.Text)),
listarticle.Select(i => new XElement("product", new XAttribute("article", i),
new XAttribute("counts", "2")))));
doc.Save(@"../data/report/" + labelCard.Text + ".xml");
Полный обработчик кода (кнопка):
Код:
{
int rowcol = checkGrid.RowCount;
List<string> listarticle = new List<string>();
List<string> listcount = new List<string>();
for (int q = 1; q <= rowcol; ++q)
{
string article = Convert.ToString(checkGrid[q, 7].FormattedText);
string count = Convert.ToString(checkGrid[q, 2].FormattedText);
listarticle.Add(article);
listcount.Add(count);
}
XDocument doc = new XDocument(
new XElement("Cards",
new XElement("Card", new XAttribute("number", labelCard.Text)),
listarticle.Select(i => new XElement("product", new XAttribute("article", i),
listcount.Select(a => new XAttribute("counts", a))))));
doc.Save(@"../data/report/" + labelCard.Text + ".xml");
}

Последний раз редактировалось tomsoer; 23.02.2017 в 09:25.
tomsoer вне форума Ответить с цитированием
Старый 23.02.2017, 09:19   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так что в ошибке-то? И что в listarticle и listcount?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.02.2017, 09:28   #3
tomsoer
 
Регистрация: 23.02.2017
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так что в ошибке-то? И что в listarticle и listcount?
Дополнил первый пост полной версией кода.
При нажатии на кнопку останавливается и выдаёт:
"Необработанное исключение типа "System.InvalidOperationExcepti on" в System.Xml.Linq.dll"
Дополнительные сведения: Повторяющийся атрибут.
tomsoer вне форума Ответить с цитированием
Старый 23.02.2017, 09:30   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вы пытаетесь засунуть все содержимое списка (listcount) в 1 XML элемент.
Select (в других языках эта функция обычно называется Map) это просто преобразование списка в какой-то другой список, 1 к 1. Например список строк в список чисел. Передали 100500 строк, получили 100500 чисел.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.02.2017, 09:51   #5
tomsoer
 
Регистрация: 23.02.2017
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вы пытаетесь засунуть все содержимое списка (listcount) в 1 XML элемент.
Select (в других языках эта функция обычно называется Map) это просто преобразование списка в какой-то другой список, 1 к 1. Например список строк в список чисел. Передали 100500 строк, получили 100500 чисел.
Чего-то тогда не совсем понимаю(. По listarticle создает элемент. Как тогда добавить атрибут на основе listcount. Перебор?!
tomsoer вне форума Ответить с цитированием
Старый 23.02.2017, 09:59   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Потому что вам надо создать XML элемент для каждого элемента в listarticle, но не надо создавать в каждом (одном) элементе атрибуты для каждого элемента из listcount.

Перебор чего? Надо или объединить списки до Select или как-нибудь по-другому добавлять (цикл, ...).

Проще всего как-то так:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace ConsoleApplication22
{
    class Program
    {
        class Product
        {
            public string Article { get; set; }
            public int Count { get; set; }
        }

        static void Main(string[] args)
        {
            var products = new List<Product>
            {
                new Product {Article = "a1", Count = 1},
                new Product {Article = "a2", Count = 2},
                new Product {Article = "a3", Count = 42},
                new Product {Article = "a4", Count = 100},
            };
            XDocument doc = new XDocument(
                new XElement("Cards",
                    new XElement("Card", new XAttribute("number", 1),
                        products.Select(p => new XElement("product",
                            new XAttribute("article", p.Article), new XAttribute("count", p.Count))))));

            Console.WriteLine(doc.ToString());
        }
    }
}
ЗЫ если что, корзина это не card, а артикул это не article.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LINQ to XML Ти6ка C# (си шарп) 2 16.05.2016 11:04
Поиск нужного места в XML и добавление в него нового элемента / LINQ ganeevez C# (си шарп) 3 26.03.2014 15:52
C#. Парсинг XML-файла с использованием библиотеки System.xml.linq Gift020 Помощь студентам 5 04.04.2013 13:44
LINQ to XML iiunbreakableii C# (си шарп) 0 03.08.2011 18:35
TreeView сохранить в xml использую linq iukash C# (си шарп) 3 24.07.2011 16:45