Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 256
1

Как распарсить XML файл и внести в него изменения?

19.02.2019, 22:29. Показов 3922. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Помогите распарсить XML файл и внести в него изменения.
Задача найти в файле все offer с category id=91451 и вставить перед, например <price>505</price> строку <oldprice>585</oldprice>.
XML следующего вида:
XML
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
<?xml version="1.0" encoding="UTF-8" ?> 
<yml_catalog date="2019-02-18 02:02">
<shop>
<currencies>
  <currency id="RUB" rate="1" /> 
</currencies>
<categories>
  <category id="91451">Наручные часы</category> 
  <category id="91452">Мужские часы</category> 
  <category id="651392">Смарт-часы</category> 
</categories>
<offers>
<offer id="1" available="true">
  <price>505</price> 
  <currencyId>RUB</currencyId> 
  <categoryId>91451</categoryId> 
  <vendor>NaviForce</vendor> 
  <name>Часы NaviForce BGYB-NF9077</name> 
<description>
<![CDATA[ … ]]> 
</description>
  <param name="Артикул">9077BGYB</param> 
  <param name="Механизм" id="103093" valueid="">Кварцевый</param> 
  <param name="Формат времени" id="103114" valueid="">12 ч</param> 
  <param name="Стекло" id="103191" valueid="">Минеральное</param> 
  <param name="Водонепроницаемость" id="103198" valueid="">30 м</param> 
  <param name="Ремешок/браслет" id="103212" valueid="">Ремешок</param> 
  <param name="Тип циферблата" id="123438" valueid="">Аналоговый (стрелочный)</param> 
  <param name="Гарантия">12 месяцев</param> 
  <param name="Стекло">Минеральное</param> 
  <param name="Ремешок/браслет">Ремешок</param> 
  <param name="Формат времени">12</param> 
  <param name="Тип циферблата">Аналоговый</param> 
  <param name="Водонепроницаемость">3 АТМ</param> 
  <param name="Тип механизма">Кварцевый</param> 
  <picture>http://.../1.jpeg</picture> 
</offer>
 
<offer id="2" available="true"></offer>
 
<offer id="3" available="true"></offer>
 
<offer id="4" available="true"></offer>
    …
</offers>
</shop>
</yml_catalog>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2019, 22:29
Ответы с готовыми решениями:

Как внести изменения в файл XML?
Здравствуйте уважаемые форумчане! Есть XML файл с ценами. Необходимо внести все изменения между...

Как внести изменения в XML-файл, не переписывая его
Есть готовый xml файл, надо найти значение и заменить не перезаписывая его полностью, а как?

Как распарсить XML-файл
А если к примеру у меня такой документ: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;Go&gt; &lt;And&gt;...

Как внести изменения в XML файл
Добрый день, не так давно начал изучать C# и возникла проблема при изменении xml файла &lt;?xml...

9
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
20.02.2019, 00:03 2
Лучший ответ Сообщение было отмечено Edgar4 как решение

Решение

Edgar4,
VB.NET
1
2
3
4
5
Dim xdoc As XDocument = XDocument.Load("catalog.xml")
Dim offers = xdoc.XPathSelectElements("/yml_catalog/shop/offers/offer[categoryId = '91451']")
For Each xoffer As XElement In offers
    xoffer.Element("price").AddBeforeSelf(New XElement("oldprice", 585))
Next
3
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 256
20.02.2019, 11:14  [ТС] 3
OwenGlendower, огромное спасибо, все работает!

Еще вопрос.
При последующих запусках программы происходит дублирование <oldprice>...</oldprice>.
Как можно поставить условие на проверку наличия <oldprice>...</oldprice>?

Добавлено через 52 минуты
Решение найдено!
VB.NET
1
2
3
4
5
If (xoffer.Element("oldprice") Is Nothing) Then
  MsgBox("oldprice найден")
Else
  MsgBox("oldprice не найден")
End If
0
Модератор
Эксперт .NET
4203 / 3287 / 497
Регистрация: 27.01.2014
Сообщений: 6,033
20.02.2019, 11:56 4
Edgar4, вроде наоборот (по-логике) должно быть?
VB.NET
1
2
3
4
5
If (xoffer.Element("oldprice") Is Nothing) Then
  MsgBox("oldprice НЕ найден")
Else
  MsgBox("oldprice найден")
End If
1
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 256
23.02.2019, 00:09  [ТС] 5
Yury Komar, я тоже так думал, а практически так как написал!
0
Модератор
Эксперт .NET
4203 / 3287 / 497
Регистрация: 27.01.2014
Сообщений: 6,033
23.02.2019, 17:04 6
Edgar4, Странно
0
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 256
13.04.2019, 13:29  [ТС] 7
OwenGlendower, Вот еще проблемка! Ни как не могу найти.
В файле есть:
XML
1
2
3
4
5
    <categories>
      <category id="91451" parentId="1162030">Наручные часы</category>
      <category id="91452" parentId="1162030">Мужские часы</category>
      <category id="651392" parentId="80263">Смарт-часы</category>
    </categories>
Как можно здесь убрать все parentId="..."?
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
13.04.2019, 16:13 8
Лучший ответ Сообщение было отмечено Edgar4 как решение

Решение

Edgar4,
VB.NET
1
2
3
4
5
6
Dim xcategories As XElement = <categories>
        <category id="91451" parentId="1162030">Наручные часы</category>
        <category id="91452" parentId="1162030">Мужские часы</category>
        <category id="651392" parentId="80263">Смарт-часы</category>
    </categories>
xcategories.Elements("category").Attributes("parentId").Remove()
2
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 256
14.04.2019, 01:12  [ТС] 9
OwenGlendower, а если с загрузкой с файла?
Что-то у меня не получается!
Повторюсь. В файле есть категории:
XML
1
2
3
4
5
    <categories>
      <category id="91451" parentId="1162030">Наручные часы</category>
      <category id="91452" parentId="1162030">Мужские часы</category>
      <category id="651392" parentId="80263">Смарт-часы</category>
    </categories>
Я пробую удалить все parentId = "..." в цикле, но ничего не получается! Где я ошибся?
VB.NET
1
2
3
4
5
6
7
8
9
        Dim xmlDoc As XDocument = XDocument.Load("yml_1.xml")
        Dim categories
 
        categories = xmlDoc.XPathSelectElements("/yml_catalog/shop/categories/category")
 
        For Each xcategory As XElement In categories
 
            xcategory.Elements("category").Attributes("parentId").Remove()
        Next
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
14.04.2019, 10:37 10
Лучший ответ Сообщение было отмечено Edgar4 как решение

Решение

Edgar4, значит ты суть решения не улавливаешь потому что откуда берется документ не играет роли.

Решение с циклом:
VB.NET
1
2
3
4
5
6
7
8
9
        Dim xmlDoc As XDocument = XDocument.Load("yml_1.xml")
        Dim categories
 
        categories = xmlDoc.XPathSelectElements("/yml_catalog/shop/categories/category")
 
        For Each xcategory As XElement In categories
 
            xcategory.Attribute("parentId").Remove()
        Next
Решение без цикла:
VB.NET
1
2
3
4
5
        Dim xmlDoc As XDocument = XDocument.Load("yml_1.xml")
        Dim categories
 
        categories = xmlDoc.XPathSelectElements("/yml_catalog/shop/categories/category")
        categories.Attributes("parentId").Remove()
3
14.04.2019, 10:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2019, 10:37
Помогаю со студенческими работами здесь

Как не распаковывая архив прочесть файл из него и внести изменения?
Средствами System.IO.Compression создал архив &quot;arhiv1.zip&quot; с текстовым файлом &quot;file1.txt&quot;....

Как внести изменения в exe-файл, не имея исходников
Есть программа . Нужно изменить в ней значение 4000000 в текстовом поле и далее уже делать...

Как внести через vim изменения в файл автоматически?
Добрый день всем! Есть несколько вопросов: 1) Как с помощью редактора vim из скрипта открыть...

Как распарсить Xml-файл
Как тут выдернуть uid first_namе и т.д. XDocument doc =...


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

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