Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 11

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

27.01.2016, 21:41. Показов 4713. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здрасте!

Есть
XML
1
2
3
4
5
6
7
8
9
10
11
12
<Head>
 <Logic>
    <variable name>1</variable>
    <variable name mask>23556</variable>
    <body>265.35</body>
 </Logic>
 <Logic>
    <variable name>3</variable>
    <variable name mask>null</variable>
    <body>2.56</body>
 </Logic>
</Head>

Мне необходимо значение между всеми <body> умножить на 1000. То есть поменять разрядность.
Зарание спасибо!!!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.01.2016, 21:41
Ответы с готовыми решениями:

Ввести файл. Каждый четный элемент в файле заменить результатом его целочисленного деления на 5. Файл вывести до и после преобразования
Доброго времени суток, форумчане! Код написал. Не работает. выдает один и тот же файл до преобразования и после. в чем моя ошибка?...

Обработка элементов файла.Каждый отрицательный элемент в файле заменить результатом его целочисленного деления на 3
Ввести файл F. Каждый отрицательный элемент в файле заменить результатом его целочисленного деления на 3. Файл вывести до и после...

Заменить каждое слово во входном файле на его зеркальное отображение
Напишите программу, которая принимает на вход два параметра: имя входного файла, имя выходного файла. Программа должна заменить каждое...

21
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
28.01.2016, 00:19
tw1ster, например, так:

data.xml

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<Head>
 <Logic>
    <Number>1</Number>
    <NumberMask>23556</NumberMask>
    <body>265.35</body>
 </Logic>
 <Logic>
    <Number>3</Number>
    <NumberMask>null</NumberMask>
    <body>2.56</body>
 </Logic>
</Head>
PowerShell
1
2
3
4
5
6
7
8
$Data = [Xml](Get-Content -Path "C:\Temp\_Test\data.xml" -Encoding UTF8)
 
foreach ($item in $Data.Head.Logic)
{
$item.body = ([double]$item.body * 1000).ToString()
}
 
$Data.Save("C:\Temp\_Test\data-new.xml")
data-new.xml

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<Head>
  <Logic>
    <Number>1</Number>
    <NumberMask>23556</NumberMask>
    <body>265350</body>
  </Logic>
  <Logic>
    <Number>3</Number>
    <NumberMask>null</NumberMask>
    <body>2560</body>
  </Logic>
</Head>
Добавлено через 50 минут
точнее, ваш xml выглядит так:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<Head>
 <Logic>
    <variable name="id">1</variable>
    <variable name="mask">23556</variable>
    <body>265.35</body>
 </Logic>
 <Logic>
    <variable name="id">3</variable>
    <variable name="mask">null</variable>
    <body>2.56</body>
 </Logic>
</Head>
но этот скрипт обработает его точно так же:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<Head>
  <Logic>
    <variable name="id">1</variable>
    <variable name="mask">23556</variable>
    <body>265350</body>
  </Logic>
  <Logic>
    <variable name="id">3</variable>
    <variable name="mask">null</variable>
    <body>2560</body>
  </Logic>
</Head>
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
28.01.2016, 09:51
KDE777, Get-Content вполне самостоятельно определяет базовые кодировки, да и метод ToString() здесь также лишний:
PowerShell
1
[xml]$x=gc file.xml;$x.Head.Logic|%{$_.body="$([Double]$_.body*1000)"};$x.Save('E:\xml\out.xml')
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
28.01.2016, 12:30
Цитата Сообщение от greg zakharov Посмотреть сообщение
да и метод ToString() здесь также лишний
В вашем примере, всё равно [Double] в [System.String] преобразуется

Если нужно написать, как можно короче, например, однострочник в консоли - ваш пример лучше.

Просто я стараюсь отвечать нагляднее + в мой пример легче добавить что-то ещё, т.к. после первого запуска получаем $item со всеми свойствами и методами...
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
28.01.2016, 12:49
Цитата Сообщение от KDE777
В вашем примере, всё равно [Double] в [System.String] преобразуется
О том и была речь.
Цитата Сообщение от KDE777
Просто я стараюсь отвечать нагляднее + в мой пример легче добавить что-то ещё, т.к. после первого запуска получаем $item со всеми свойствами и методами...
Это все правильно, но автор темы задал четкие рамки, поэтому вряд ли понадобится добавлять что-то еще.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
28.01.2016, 23:01
Цитата Сообщение от greg zakharov Посмотреть сообщение
поэтому вряд ли понадобится добавлять что-то еще
Тогда сэкономим ещё 3 символа

PowerShell
1
([xml]$x=gc file.xml).Head.Logic|%{$_.body="$([Double]$_.body*1000)"};$x.Save("$pwd\out.xml")
0
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 11
29.01.2016, 12:15  [ТС]
Сильно извиняюсь. Думал сам додумаю как подогнать под свои нужды ответы.
Но видимо не судьба. Во вложении файл xml.
Мне необходимо значение между всеми <petrolWeight> умножить на 1000. То есть поменять разрядность.
Зарание большое спасибо!!!
Вложения
Тип файла: rar doc.rar (12.4 Кб, 8 просмотров)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.01.2016, 12:32
PowerShell
1
2
3
4
[xml]$xml=cat "$pwd\doc.xml"
(select-xml -XPath "//petrolWeight//text()" -Xml $xml).Node|%{
    [double]$_.Data*=1000
}; $xml.Save("$pwd\doc.xml")
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2016, 13:06
Garry Galler, У типа System.Xml.XmlDocument есть метод SelectNodes, поэтому можно обойтись без select-xml

PowerShell
1
([xml]$x=gc "$pwd\doc.xml").SelectNodes("//petrolWeight//text()")|%{[Double]$_.Data*=1000};$x.Save("$pwd\doc.xml")
0
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 11
29.01.2016, 13:07  [ТС]
Выходит ошибка. И не проходит умножение
Не удается найти свойство "petrolWeight" для данного объекта; убедитесь в том, что оно существует и является устанавливаемым.
строка:3 знак:16
+ [double]$_. <<<< petrolWeight*=1000
+ CategoryInfo : InvalidOperation: (petrolWeight:String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFo
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2016, 13:12
tw1ster, а вы точно выполнили как вам ответили?

Нужно не [double]$_.petrolWeight*=1000, а именно: [double]$_.Data*=1000
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.01.2016, 13:31
KDE777,
есть метод SelectNodes
Да, чего то я забыл про него - так короче.

tw1ster,
Вы оба вышеприведенных кода как есть выполняли или меняли что то? И какая у вас версия PoSH? (так, на всякий случай - нюансы разные могут быть). Я пишу на 5-ой.

Добавлено через 10 минут
Попробуйте (хотя не знаю имеет ли смысл) строчку [double]$_.Data*=1000 заменить на
PowerShell
1
$_.Data=[double]$_.Data*1000
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
29.01.2016, 15:59
tw1ster, какая версия PowerShell?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.01.2016, 17:32
На версии 2.0 оба наших, c KDE777, кода не пашут - проверил.
(select-xml -XPath "//petrolWeight" -Xml $xml).Node ничего не возвращает.
И SelectNodes отсутствует. Поэтому остается, наверно, обращаться к элементам как в первых вариантах.
Либо установить хотя бы 3-ый PoSh.
PS: Если у ТС стоит 2-ой, то выходит что ось XP...

Добавлено через 41 минуту
...Кстати, первые варианты кодов тоже ведь не работают на 2.0.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2016, 17:32
Цитата Сообщение от Garry Galler Посмотреть сообщение
На версии 2.0 оба наших, c KDE777, кода не пашут - проверил.
Ну тогда пусть попробует тот способ, с которого и начали:

PowerShell
1
2
3
4
5
6
$Data = [Xml](Get-Content -Path "C:\xml\doc.xml")
foreach ($item in ($Data.IBS_Trade_House.body.operation.linedoc | where {$_.petrolWeight}))
{
$item.petrolWeight = ([double]$item.petrolWeight * 1000).ToString()
}
$Data.Save("C:\xml\doc1.xml")
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.01.2016, 17:42
Я пробовал точно такую же такую конструкцию - не пашет.

Добавлено через 1 минуту
В $Data.IBS_Trade_House.body.operation.lin edoc - возвращается $null.

Добавлено через 1 минуту
Остаются, пожалуй, только старые добрые регулярки или replace.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2016, 17:43
Если проверить:

PowerShell
1
2
3
4
Write-host "Было:"
([xml]$x=gc doc.xml).SelectNodes("//petrolWeight//text()").Data
Write-host "Стало:"
([xml]$x=gc doc1.xml).SelectNodes("//petrolWeight//text()").Data
Было:
3078.219
784.286
586.564
21.86

Стало:
3078219
784286
586564
21860
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.01.2016, 17:59
KDE777,
?

Добавлено через 11 минут
Я проверял все варианты на powershell запущенном в режиме 2.0 - ни один не сработал.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2016, 19:16
Garry Galler, проверил на PS 2.0 - у меня заработало так:

PowerShell
1
2
3
4
5
6
$Data = [Xml](Get-Content -Path "C:\xml\doc.xml")
foreach ($item in $data.SelectNodes("//petrolWeight/text()"))
{
$item.Data = ([double]$item.Data * 1000).ToString()
}
$Data.Save("C:\xml\doc1.xml")
Проверяем:

PowerShell
1
2
3
4
5
6
$PSVersionTable.PSVersion
 
Write-host "Было:"
[xml]$x=gc doc.xml;$x.SelectNodes("//petrolWeight//text()") | ft ParentNode,Data -a
Write-host "Стало:"
[xml]$x=gc doc1.xml;$x.SelectNodes("//petrolWeight//text()") | ft ParentNode,Data -a
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1

Было:

ParentNode Data
---------- ----
petrolWeight 3078.219
petrolWeight 784.286
petrolWeight 586.564
petrolWeight 21.86

Стало:

ParentNode Data
---------- ----
petrolWeight 3078219
petrolWeight 784286
petrolWeight 586564
petrolWeight 21860

Добавлено через 16 минут
tw1ster, попробуйте такой вариант. У меня он заработал на PS 2,3,4

PowerShell
1
2
3
4
5
6
$Data = [Xml](Get-Content -Path "C:\xml\doc.xml")
foreach ($item in $data.SelectNodes("//petrolWeight/text()"))
{
$item.Data = [double]$item.Data * 1000
}
$Data.Save("C:\xml\doc1.xml")
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.01.2016, 19:45
KDE777,
Да, в таком варианте работает и на отсутствие SelectNodes не ругается. А еще говорят что от перестановки мест ничего не меняется

Добавлено через 8 минут
Нда, стоило вынести получение контента и приведение его к нужному типу в отдельную строку и все стало работать:
PowerShell
1
2
3
4
[xml]$xml=cat "$pwd\doc.xml"
$xml.SelectNodes("//petrolWeight/text()")|%{
    $_.Data=[double]$_.Data * 1000
}; $xml.Save("$pwd\doc.xml")
А ведь код почти тот же самый...

Добавлено через 9 минут
Но вот с select-xml никак.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.01.2016, 19:45
Помогаю со студенческими работами здесь

Если x, y отрицательные, то каждое значение заменить его модулем
Дано действительные числа x, y. Если x, y отрицательные, то каждое значение заменить его модулем; если от отрицательное только одно число,...

Если x, y отрицательны, то каждое значение заменить его модулем
помогите не могу написать код... напишите программу пожалуйста... Даны действительные числа x, y. Если x, y отрицательны, то каждое...

Если x, y отрицательны, то каждое значение заменить его модулем
Даны действительные числа x, y. Если x, y отрицательны, то каждое значение заменить его модулем; если отрицательное только одно из них, то...

Если х, у — отрицательны, то каждое значение заменить его модулем
Даны действительные числа х и у. Если х, у - отрицательны, то каждое значение заменить его модулем; если отрицательно хотя бы одно из них,...

Если x, y отрицательны, то каждое значение заменить его модулем
Даны действительные числа x, y. Если x, y отрицательны, то каждое значение заменить его модулем; если отрицательное только одно из них, то...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru