1 (изменено: Creater3d, 2019-05-30 20:23:20)

Тема: Как создать AHK для изменения xml-файла внутри или другие варианты?

Задача:
Сделать внутри каждого отдельного рездела <offer> копирование текста внутри строки(текста с именем товара) <name> *.* </name> и перенести внутренне содержание с заменой внутрь строки <vendor>*.*</vendor>, взамен “*.*”.

Часть структуры в файле:

<offer available="true" id="770448733">
    <name> Тра-10-10</name>
    <vendor>офвржпар</vendor>
</offer>

2

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

На каком языке должен быть скрипт?

3

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker Подскажит какие есть варианты решение этой задачи?

4

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

ypppu У меня есть задача такого рода, про язык под вопросом, может не обязательно батник, а есть программа.

5

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Тема перемещена в "Прочие скриптовые технологии".

6

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Creater3d пишет:

Подскажит какие есть варианты решение этой задачи?

Можно решить AHK-скриптом, про батник не знаю.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker Как?

8

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Чтобы прочитать содержание XML-узла, нужно знать его расположение в DOM, т. е. для создания кода нужен пример реального файла, а не просто название тега.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Хотя нет, вру, давно не работал с XML, можно и просто зная нужный тег:

filePath := "C:\Users\User\Desktop\test.xml" ; указать путь к файлу

xmlDoc := ComObjCreate("Microsoft.XMLDOM")
xmlDoc.load(filePath)
coll := xmlDoc.getElementsByTagName("offer")

for item in coll {
   nameText := item.getElementsByTagName("name").(0).text
   item.getElementsByTagName("vendor").(0).text := nameText
}

xmlDoc.Save(filePath)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

<offers>
<offer available="true" id="770448733">
    <name> Тара 10</name>
    <vendor>лоижло</vendor> 
  </offer>

  <offer available="true" id="793606558">
    <name>Тара 20</name>
    <vendor>алоплфдаоп</vendor>
  </offer>
</offers>

Это пример по которому надо сделать.

11

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker

<offers>
<offer available="true" id="770448733">
    <name> Тара 10</name>
    <vendor>лоижло</vendor> 
  </offer>

  <offer available="true" id="793606558">
    <name>Тара 20</name>
    <vendor>алоплфдаоп</vendor>
  </offer>
</offers>

12

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

А скрипт в моем посте как есть не работает? Или у вас xml не в файле находится?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker Я не знаю куда его вставлять.

14

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Сохраните в файл в кодировке UTF-8 с расширением ahk, укажите в тексте правильный путь к файлу, установите AHK, запустите скрипт.
Думаю, что аналогичный код можно написать на VBS, тогда ничего устанавливать не нужно будет, но я в VBS не умею.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker Через текстовый редактор?

16

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Да, можно блокнотом.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

А потом куда?

18

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Куда что?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker Хреново посоветовали, этот скрипт полностью стирает файл!!

20 (изменено: teadrinker, 2019-05-29 23:16:47)

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Покажите, как текст скрипта выглядит у вас.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

filePath := "C:\Users\Дом\Desktop\Test.xml" ; указать путь к файлу

xmlDoc := ComObjCreate("Microsoft.XMLDOM")
xmlDoc.load(filePath)
coll := xmlDoc.getElementsByTagName("offer")

for item in coll {
   nameText := item.getElementsByTagName("name").(0).text
   item.getElementsByTagName("vendor").(0).text := nameText
}

xmlDoc.Save(filePath)

22

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

В какой кодировке сохранен xml файл?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker, а зачем использовать устареший Microsoft.XMLDOM, когда есть MSXML2.DOMDocument.3.0, MSXML2.DOMDocument.4.0 и MSXML2.DOMDocument.6.0?

24

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Это что?

25

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Malcev пишет:

teadrinker, а зачем использовать устареший Microsoft.XMLDOM, когда есть MSXML2.DOMDocument.3.0, MSXML2.DOMDocument.4.0 и MSXML2.DOMDocument.6.0?

А чем они в данном случае лучше? Я редко с XML работаю, не помню, какие версии актуальны.
У меня код не работает, если xml-файл в таком виде сохранён в ANSI.

Creater3d пишет:

Это что?

Гуглите, xml-файл должен быть сохранён в кодировке utf-8.
Вот безопасный вариант скрипта:

filePath := "C:\Users\User\Desktop\test.xml" ; указать путь к файлу

xmlDoc := ComObjCreate("Microsoft.XMLDOM")

if !xmlDoc.load(filePath) {
   MsgBox, Не удалось загрузить документ
   Return
}

coll := xmlDoc.getElementsByTagName("offer")
if !coll.Length {
   MsgBox, Теги <offer> не найдены
   Return
}

for item in coll {
   nameText := item.getElementsByTagName("name").(0).text
   item.getElementsByTagName("vendor").(0).text := nameText
}

xmlDoc.Save(filePath)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker пишет:

А чем они в данном случае лучше?

Не знаю, я думал ты специально использовал этот объект.

27

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Нет, я только проверил, работает ли он в десятке — работает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Тоже самое по нулям.

29

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

У меня Windows 7-64.

30

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Как понять по нулям? Какое-то сообщение выводит? XML-файл в UTF-8?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

31

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker Формат UTF-8, после запуска скприпта, в файле все записи стираются и становтся равным 0 МБ.

32

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Что-то не так делаете, наверно. Скрипт (последняя версия) либо сообщение об ошибке должен выдать, либо всё в порядке. Присылайте ваш файл, можно к сообщению прицепить, проверим.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

33

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker

Post's attachments

Test.xml 272 b, 5 downloads since 2019-05-30 

You don't have the permssions to download the attachments of this post.

34 (изменено: Creater3d, 2019-05-30 01:42:00)

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker

Post's attachments

Скрипт.ahk 380 b, 3 downloads since 2019-05-30 

You don't have the permssions to download the attachments of this post.

35

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker Мне надо из такого:

<offers>
<offer available="true" id="770448733">
    <name> Тара 10</name>
    <vendor>лоижло</vendor> 
  </offer>

  <offer available="true" id="793606558">
    <name>Тара 20</name>
    <vendor>алоплфдаоп</vendor>
  </offer>
</offers>

Получить такое:

<offers>
<offer available="true" id="770448733">
    <name> Тара 10</name>
    <vendor>Тара 10</vendor> 
  </offer>

  <offer available="true" id="793606558">
    <name>Тара 20</name>
    <vendor>Тара 20</vendor>
  </offer>
</offers>

Что оно поменяло в каждом отдельном разделе "offer".

36

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

У меня работает:

https://i.imgur.com/xiOu9iP.png

filePath := "C:\Users\User\Desktop\Test.xml" ; указать путь к файлу

xmlDoc := ComObjCreate("Microsoft.XMLDOM")

if !xmlDoc.load(filePath) {
   MsgBox, Не удалось загрузить документ
   Return
}

coll := xmlDoc.getElementsByTagName("offer")
if !coll.Length {
   MsgBox, Теги <offer> не найдены
   Return
}

for item in coll {
   nameText := item.getElementsByTagName("name").(0).text
   item.getElementsByTagName("vendor").(0).text := nameText
}

xmlDoc.Save(filePath)

Проверял на Windows 7 64, AHK 1.1.30.3 Unicode 64

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

37

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

AHK 1.1.30.3 Unicode 64 - где взять?

38

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Может не в UTF-8 сохранять файл?

39

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

На сайте AHK, сохранять нужно в UTF-8.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

40 (изменено: Creater3d, 2019-05-30 08:28:35)

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker Функционирует.

41

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

<offers>
<offer available="true" id="770448733">
    <name> Тара 10</name>
<vendor>Тара 10</vendor>
    <vendor>лоижло</vendor>
  </offer>

  <offer available="true" id="793606558">
    <name>Тара 20</name>
<vendor>Тара 20</vendor>
    <vendor>алоплфдаоп</vendor>
  </offer>
</offers>

Как сделать AHK, для того чтоб в каждом <offer> удалить второй <vendor>?

42

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

Если уж тут речь идёт исключительно об AHK, отредактируйте заголовок топика так, чтобы он соответствовал его содержанию. Это нужно для того, чтобы тем, кто столкнулся с подобными задачами, было легче найти ответ на форуме.
Для оформления кода используйте соответствующий тег.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

43

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

filePath := "C:\Users\User\Desktop\Test.xml" ; указать путь к файлу

xmlDoc := ComObjCreate("Microsoft.XMLDOM")

if !xmlDoc.load(filePath) {
   MsgBox, Не удалось загрузить документ
   Return
}

coll := xmlDoc.getElementsByTagName("offer")
if !coll.Length {
   MsgBox, Теги <offer> не найдены
   Return
}

for item in coll {
   vendor2 := item.getElementsByTagName("vendor").(1)
   vendor2.parentNode.removeChild(vendor2)
}

xmlDoc.Save(filePath)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

44 (изменено: Creater3d, 2019-05-30 21:34:30)

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

teadrinker Функционирует.

45 (изменено: Creater3d, 2019-06-04 12:31:09)

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

<offers>
<offer available="true" id="770448733">
    <name> Тара 10 </name>
<vendor> Тара 10 </vendor>
    <param name="Габариты:" unit="">160x200x300 мм</param>
  </offer>

  <offer available="true" id="793606558">
    <name> Тара 20 </name>
<vendor> Тара 20 </vendor>
<param name="Габариты:" unit="">500x900x600 мм</param>
    </offer>
</offers>

Подскажите, как сделать скрипт для копирования каждого отдельного параметра <offer>, каждого отдельного значения параметра "Габариты", чтоб оно стояло в поле <vendor>, после названия товара?

Пример - как должно быть:

<offers>
<offer available="true" id="770448733">
    <name> Тара 10 </name>
<vendor> Тара 10 160x200x300 мм</vendor>
    <param name="Габариты:" unit="">160x200x300 мм</param>
  </offer>

  <offer available="true" id="793606558">
    <name> Тара 20 </name>
<vendor> Тара 20 500x900x600 мм</vendor>
<param name="Габариты:" unit="">500x900x600 мм</param>
    </offer>
</offers>

46

Re: Как создать AHK для изменения xml-файла внутри или другие варианты?

По аналогии с тем, что выше. Чтобы прочитать значение name, используется метод getAttribute():

filePath := A_Desktop . "\test.xml" ; указать путь к файлу

xmlDoc := ComObjCreate("Microsoft.XMLDOM")

if !xmlDoc.load(filePath) {
   MsgBox, Не удалось загрузить документ
   Return
}

coll := xmlDoc.getElementsByTagName("offer")
if !coll.Length {
   MsgBox, Теги <offer> не найдены
   Return
}

for item in coll {
   param := item.getElementsByTagName("param").(0)
   MsgBox, % name := param.getAttribute("name")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder