Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 44
1

Не получается сформировать строку для YML

25.07.2012, 13:50. Показов 3103. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, создаю YML для яндекс маркета...мне нужно выводить строку с параметрами, вида:
<param name="Тип процессора">Atom</param> - пример.
Проблема в том что я работаю с С#...и у меня нету идей как можно сформировать такую строку...
Вот код:
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
30
31
32
33
34
35
36
37
38
39
 public string CharName { get; set; }
        public string CharValue { get; set; }
 
 
 AutoLabDecorDataContext context = new AutoLabDecorDataContext();
                var charvallues = context.ProductCharacteristicsValues.Where(c => c.ProductID == prodAutoElem.Product.ID).Distinct();
 
  //GSDFGSD() - колекция транслитирации символов....Она обьемная, решил не вылаживать тут
 
   foreach (ProductCharacteristicsValue prodcharvalue in charvallues)
                {
                    if (prodcharvalue.ListID != null)
                    {
                        CharName = GSDFGSD(prodcharvalue.ProductCharacteristic.Name);
                        CharValue = prodcharvalue.ProductCharacteristicsValuesList.Value;
                    }
                    else
                        if (prodcharvalue.ListID == null && !String.IsNullOrEmpty(prodcharvalue.Text))
                        {
                            CharName = GSDFGSD(prodcharvalue.ProductCharacteristic.Name);
                            CharValue = prodcharvalue.Text;
                        }
                        else
                            if (prodcharvalue.ListID == null && prodcharvalue.Int != null)
                            {
                                CharName = GSDFGSD(prodcharvalue.ProductCharacteristic.Name);
                                CharValue = prodcharvalue.Int.ToString();
                            }
                            else
                            {
                                CharName = GSDFGSD(prodcharvalue.ProductCharacteristic.Name);
                                CharValue = prodcharvalue.Bool != null ? "1" : "0";
                            }
                     // Ниже, требуется в ноде сформировать строку в yml.
 
                    XmlNode charName11 = doc.CreateNode(XmlNodeType.Element, "param name=" +   "GSDFGSD(CharName)"  , String.Empty);
                    charName11.InnerText = GSDFGSD(CharValue);
                    offer.AppendChild(charName11);
                }
Это не весь код, это основные елементы которые помогут вам наглядно увидеть с чем я работаю...
При создании ноды мне нужно сделать правильный формат строки, сейчас там написан бред...
Я очень надеюсь на вашу помощь, заранее спасибо...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2012, 13:50
Ответы с готовыми решениями:

Не получается сформировать json строку из вывода БД
Пытаюсь передать данные через джсон как показано на видео $data = array(); foreach($res as ...

Для заданной строки сформировать новую строку, состоящую только из цифр, входящих в начальную строку
Функция записи и тестирования, которая для заданной строки формирует новую строку, состоящую только...

Не получается сформировать регулярное выражение для RegularExpressionValidator
Привет товарищи, подсобите пожалуйста. Мне нужно регулярку добавить в валидатор приведенный ниже...

XML-схема для YML
Добрый день. Подскажите пожалуйста ссылку на XML-схему для YML (Yandex Market Language), либо...

10
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.07.2012, 14:47 2
Так там же обычный XML. Используйте XMLWriter.
C#
1
2
3
4
writer.WriteStartElement("param");
writer.WriteAttributeString("name", "Тип процессора");
writer.WriteValue("Atom");
writer.WriteEndElement();
1
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 44
25.07.2012, 15:30  [ТС] 3
Большое спасибо за подсказку, от меня + )
Но как мне потом этот writter засунуть в ноду и заставить правильно выводить?

Добавлено через 2 минуты
C#
1
2
3
4
5
   XmlTextWriter w = new XmlTextWriter(Console.Out);
                    w.WriteStartElement("param");
                    w.WriteAttributeString("name", GSDFGSD(CharName));
                    w.WriteValue(GSDFGSD(CharValue));
                    w.WriteEndElement();
вот так я оформил...
0
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.07.2012, 15:37 4
Я пишу так:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
        struct StructForMarket
        {
            public string Code;
            public string PosName;
            public string PosDescr;
            public string PictureName;
            public string Vendor;
            public string Price;
            public int SubCategoryID;
            public List<int> CategoryIDs;
            public string Link;
            public bool Available;
            public string CatNumber;
        }
 
        List<StructForMarket> AllMarketPositions;
        StringCollection Categories;
        StringCollection Types;
 
        /// <summary>
        /// Запись файла для Яндекс.Маркета
        /// </summary>
        /// <param name="FileName">Имя файла для записи</param>
        /// <param name="ShopName">Название магазина</param>
        /// <param name="CompanyName">Название компании</param>
        /// <param name="MinPrice">Минимальная цена для добавления в прайс</param>
        /// <param name="URL">URL магазина</param>
        public void WriteYandexMarketFile(string FileName, string ShopName, string CompanyName, string MinPrice, string LogFile, string URL)
        {
            WriteToLogFile("Начата запись файла Яндекс.Маркета " + FileName, LogFile);
 
            double MinPriceDbl = 0;
            try
            {
                MinPriceDbl = Double.Parse(MinPrice);
                WriteToLogFile("Установлена минимальная цена: " + MinPriceDbl.ToString(), LogFile);
            }
            catch (Exception)
            { }
 
            XmlTextWriter writer = null;
 
            try
            {
                writer = new XmlTextWriter(FileName, System.Text.Encoding.GetEncoding(1251));
                writer.Formatting = Formatting.Indented;
 
                writer.WriteStartDocument();
 
                writer.WriteDocType("yml_catalog", null, "shops.dtd", null);//!!!!!!!!!!!!!!!!!!!!!!!!!
 
                writer.WriteStartElement("yml_catalog");
                writer.WriteAttributeString("date", DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
 
                writer.WriteStartElement("shop");   //start of SHOP
                writer.WriteStartElement("name");
                writer.WriteValue(ShopName);
                writer.WriteEndElement();
 
                writer.WriteStartElement("company");
                writer.WriteValue(CompanyName);
                writer.WriteEndElement();   //end of CompanyName
 
                writer.WriteStartElement("url");
                writer.WriteValue(URL);
                writer.WriteEndElement();   //end of URL
 
                writer.WriteStartElement("currencies");
                writer.WriteStartElement("currency");
                writer.WriteAttributeString("id", "UAH");
                writer.WriteAttributeString("rate", "1");
                writer.WriteEndElement();   //end of current currency
                writer.WriteEndElement();   //end of all currencies
 
 
                writer.WriteStartElement("categories");
 
                for (int i = 0; i < Types.Count; i++)
                {
                    writer.WriteStartElement("category");
                    writer.WriteAttributeString("id", (i + 1).ToString());
                    writer.WriteValue(Types[i]);
                    writer.WriteEndElement();
 
                    for (int j = 0; j < Categories.Count; j++)
                    {
                        writer.WriteStartElement("category");
                        writer.WriteAttributeString("id", (i + 1).ToString() + j.ToString());
                        writer.WriteAttributeString("parentId", (i + 1).ToString());
                        writer.WriteValue(Categories[j]);
                        writer.WriteEndElement();
                    }
                }
 
                writer.WriteEndElement();   //end of categories
 
                writer.WriteStartElement("offers");
 
                foreach (StructForMarket OneYaPos in AllMarketPositions)
                {
                    if (OneYaPos.Link == null)
                        continue;
 
                    if (!OneYaPos.Available)
                        continue;
 
                    try
                    {
                        if (Double.Parse(OneYaPos.Price.Replace('.', ',')) < MinPriceDbl)
                            continue;
 
                    }
                    catch (Exception)
                    { }
 
 
                    if ((OneYaPos.CategoryIDs == null) || (OneYaPos.CategoryIDs.Count == 0))
                        continue;
 
 
                    writer.WriteStartElement("offer");
                    writer.WriteAttributeString("id", OneYaPos.Code);
                    writer.WriteAttributeString("available", OneYaPos.Available.ToString().ToLower());
 
                    writer.WriteStartElement("url");        //start of url
                    writer.WriteValue(OneYaPos.Link);
                    writer.WriteEndElement();               //end of url
 
                    writer.WriteStartElement("price");        //start of price
                    writer.WriteValue(OneYaPos.Price);
                    writer.WriteEndElement();               //end of price
 
                    writer.WriteStartElement("currencyId");        //start of currencyId
                    writer.WriteValue("UAH");
                    writer.WriteEndElement();               //end of currencyId
 
                    foreach (int k in OneYaPos.CategoryIDs) //write categories
                    {
                        writer.WriteStartElement("categoryId");        //start of categoryId
                        writer.WriteValue(k.ToString() + OneYaPos.SubCategoryID.ToString());
                        writer.WriteEndElement();               //end of categoryId
 
                        break;
                    }
 
                    if (OneYaPos.PictureName.Replace(URL + @"/images/", "").Replace(" ", "") != "")
                    {
                        writer.WriteStartElement("picture");        //start of picture
                        writer.WriteValue(OneYaPos.PictureName);
                        writer.WriteEndElement();               //end of picture
                    }
 
                    writer.WriteStartElement("name");        //start of name
                    writer.WriteValue(OneYaPos.PosName);
                    writer.WriteEndElement();               //end of name
 
                    writer.WriteStartElement("description");        //start of description
                    writer.WriteValue(OneYaPos.PosDescr);
                    writer.WriteEndElement();               //end of description
 
                    writer.WriteEndElement();               //end of current offer
                }
 
 
                writer.WriteEndElement();   //end of all offers
 
                writer.WriteEndElement();   //end of shop
                writer.WriteEndDocument();  //end of document
 
            }
            catch (Exception ex)
            {
                WriteToLogFile("Ошибка: " + ex.Message, LogFile);
            }
            finally
            {
                if (writer != null)
                    writer.Close();
            }
 
            WriteToLogFile("Окончена запись файла Яндекс.Маркета " + FileName, LogFile);
             
        }
Код не идеален, но все же.
1
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 44
25.07.2012, 15:49  [ТС] 5
Спасибо, очень наглядно...правда у меня совсем другой способ оформления..буду думать как бы это все можно было организовать, у меня все формируется нодами...и такой вариант записи не очень удобен...вот часть моего кода :
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public override string Generate()
        {
            try
            {
                this.ProductService.DeleteDataContext();
               // using (AutoLabDecorDataContext context = new AutoLabDecorDataContext(this.connectionString))
                {
                    XmlDocument doc = new XmlDocument();
                    var declaration = doc.CreateXmlDeclaration("1.0", "windows-1251", "");
                    XmlElement root = doc.DocumentElement;
                    doc.InsertBefore(declaration, root);
 
                    XmlDocumentType dt = doc.CreateDocumentType("yml_catalog", null, "http://partner.market.yandex.ru/pages/help/shops.dtd", null);
                    doc.InsertBefore(dt, root);
                  
                    XmlNode catalog = doc.CreateNode(XmlNodeType.Element, "yml_catalog", String.Empty);
                    doc.AppendChild(catalog);
 
                    XmlAttribute date = (XmlAttribute)doc.CreateNode(XmlNodeType.Attribute, "date", String.Empty);
                    date.Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
                    catalog.Attributes.Append(date);
                    doc.AppendChild(catalog);
 
                    XmlNode shop = doc.CreateNode(XmlNodeType.Element, "shop", String.Empty);
                    catalog.AppendChild(shop);
 
                    XmlNode firmName = doc.CreateNode(XmlNodeType.Element, "name", String.Empty);
                    firmName.InnerText = "Лаборатория автодекора";
                    shop.AppendChild(firmName);
 
                    XmlNode company = doc.CreateNode(XmlNodeType.Element, "company", String.Empty);
                    company.InnerText = "Лаборатория автодекора";
                    shop.AppendChild(company);
 
                    XmlNode urlSite = doc.CreateNode(XmlNodeType.Element, "url", String.Empty);
                    urlSite.InnerText = GSDFGSD(Constants.LabAutoDecorUrl);
                    shop.AppendChild(urlSite);
 
                    XmlNode currencies = doc.CreateNode(XmlNodeType.Element, "currencies", String.Empty);
                    XmlNode currency = doc.CreateNode(XmlNodeType.Element, "currency", String.Empty);
                    XmlAttribute currId = (XmlAttribute)doc.CreateNode(XmlNodeType.Attribute, "id", String.Empty);
                    currId.Value = "UAH";
                    currency.Attributes.Append(currId);
                    currencies.AppendChild(currency);
                    shop.AppendChild(currencies);
 
                    var categoriesList =
                        ProductService.DataContext.ProductCategories.Where(pc => !pc.ParentProductCategoryID.HasValue).Distinct();
 
                    XmlNode categories = doc.CreateNode(XmlNodeType.Element, "categories", String.Empty);
                    shop.AppendChild(categories);
 
                    foreach (var cat in categoriesList)
                    {
                        XmlNode category = doc.CreateNode(XmlNodeType.Element, "category", String.Empty);
                        category.InnerText = HttpUtility.HtmlEncode(cat.Name);
                        XmlAttribute catId = (XmlAttribute)doc.CreateNode(XmlNodeType.Attribute, "id", String.Empty);
                        catId.Value = cat.ID.ToString();
                        category.Attributes.Append(catId);
                        categories.AppendChild(category);
                    }
                    XmlNode local_delivery_cost = doc.CreateNode(XmlNodeType.Element, "local_delivery_cost", String.Empty);
                    local_delivery_cost.InnerText = "0";
                    shop.AppendChild(local_delivery_cost);
 
                   var items = doc.CreateElement("offers");
                   shop.AppendChild(items);
                   var prodAutoElems = this.ProductService.GetProductAutoModelEntitiesByCategory(default(int?)).Where(
                          p => p.Product.ProductCategory.ParentProductCategoryID != Constants.CustomBagSubCategoryID).Distinct();
                   this.AddItemsNode2(doc, items, prodAutoElems);
                   doc.Save(HttpContext.Current.Request.PhysicalApplicationPath + "MarketsData\\labautodecor.yml");
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return String.Empty;
        }
Небольшая часть...
0
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.07.2012, 16:01 6
Я пробовал по-вашему и, если честно, совершенно не понравилось Как по мне, writer как-то удобнее. Хотя каждому свое конечно же.
0
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 44
25.07.2012, 16:07  [ТС] 7
Все дело в том что я не знал об этом елементе.
Если бы знал, возможно еще задумался стоит ли...а так поздно уже все переделывать из за 1 параметра.

Добавлено через 4 минуты
Подскажите тогда как вы выводили характеристики создавая прайс по моему медоту...ничего не получается...буду очень благодарен
0
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.07.2012, 16:14 8
Подскажите тогда как вы выводили характеристики создавая прайс по моему медоту...ничего не получается...буду очень благодарен
По вашему? У меня нет того кода, я отказался от него, переделал на writer... Попробуйте заполнить List<StructForMarket> AllMarketPositions в моем коде и вызвать мою функцию, я думаю там не так сложно будет переделать.
1
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 44
25.07.2012, 16:17  [ТС] 9
Нет, это не вариант...
Но спасибо за за помощь...буду думать дальше.
0
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.07.2012, 16:34 10
А если использовать создание XmlWriter-a как
C#
1
2
StringBuilder SB = new StringBuilder("");
XmlWriter w = XmlWriter.Create(SB);
а потом использовать
C#
1
XmlNode.InnerXml = SB.ToString();
?
0
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 44
25.07.2012, 17:24  [ТС] 11
Стринг билдер тоже не подойдет...характеристик очень много...
0
25.07.2012, 17:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2012, 17:24
Помогаю со студенческими работами здесь

Не получается задать строку для связи с БД SQL Server
Собственно проблема в том что,я создал таблицы в БД,но Я выложил фотку,где именно они создались!...

Нужен скрипт для выгрузки прайса товара с Яндекс.Маркет в XML/YML
Нужен скрипт или модуль выгрузки прайса товара с сайта в xml/yml

Как эффективней сформировать строку для свойства DataView.RowFilter
Добрый вечер! Подскажите как эффективней сформировать строку для свойства DataView.RowFilter?...

Найти элементы, общие для двух введенных строк, и сформировать из них новую строку
Исходные данные: Найти элементы, общие для двух введенных строк, и сформировать из них новую...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru