Войти

Показать полную графическую версию : [решено] Поиск строки по слову и добавление двух новых строк после найденой.


Angel79
31-05-2024, 11:24
Здравствуйте.

Задача:
Есть XML файл примерно такого вида:

<?xml version="1.0" encoding="windows-1251"?>
<Файл xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ИдФайл="739e2a13b4a">
<ИнфПолФХЖ1>
<ТекстИнф Идентиф="ИдентификаторДокументаОснования" Значен="9999999-03bb-11ef-9ae6-00155d0a8205"/>
<ТекстИнф Идентиф="ВидСчетаФактуры" Значен="Реализация"/>
<ТекстИнф Идентиф="ТолькоУслуги" Значен="true"/>
<ТекстИнф Идентиф="ДокументОбОтгрузке" Значен="111 от 01.01.2024 г."/>
</ИнфПолФХЖ1>
</Файл>


Необходимо написать батник, который добавит пару строк в XML файле.

В нем нужно найти строку содержащие текст "ТекстИнф Идентиф="ДокументОбОтгрузке" и добавить после этой строки ещё две строки
Например:
<ТекстИнф Идентиф="номер_тк" Значен="0146"/>
<ТекстИнф Идентиф="код_получателя" Значен="s"/>

Должно получиться вот так:


<?xml version="1.0" encoding="windows-1251"?>
<Файл xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ИдФайл="739e2a13b4a">
<ИнфПолФХЖ1>
<ТекстИнф Идентиф="ИдентификаторДокументаОснования" Значен="9999999-03bb-11ef-9ae6-00155d0a8205"/>
<ТекстИнф Идентиф="ВидСчетаФактуры" Значен="Реализация"/>
<ТекстИнф Идентиф="ТолькоУслуги" Значен="true"/>
<ТекстИнф Идентиф="ДокументОбОтгрузке" Значен="111 от 01.01.2024 г."/>
<ТекстИнф Идентиф="номер_тк" Значен="0146"/>
<ТекстИнф Идентиф="код_получателя" Значен="s"/>
</ИнфПолФХЖ1>
</Файл>


Обработанный файл нужно сохранить под тем же именем.

Возможно кто то уже сталкивался с похожей задачей.
Буду весьма благодарен за любую подсказку.

Заранее огромное спасибо!

DJ Mogarych
31-05-2024, 12:14
powershell

$file = "C:\temp\in\file.xml"

$xmlfile = [xml](gc $file)

function Add-XmlElement ($id,$value) {
$newElement = $xmlfile.CreateElement("ТекстИнф")
$newElementAdd = $xmlfile.Файл.ИнфПолФХЖ1.AppendChild($newElement)
$newElementAttribute = $newElementAdd.SetAttribute("Идентиф","$id")
$newElementAttribute = $newElementAdd.SetAttribute("Значен","$value")
}

Add-XmlElement -id "номер_тк" -value "0146"
Add-XmlElement -id "код_получателя" -value "s"

$xmlfile.Save($file)


https://habr.com/ru/articles/524288/
https://www.tutorialspoint.com/how-to-add-an-attribute-to-the-xml-file-using-powershell

Angel79
31-05-2024, 12:32
Круто всё работает.
А как сделать чтоб замена прошла по всем XML файлам c разными именами в определённой папке.

DJ Mogarych
31-05-2024, 13:12
Добавил, чтобы один и тот же ID не добавлялся несколько раз.

function Add-XmlElement ($id,$value) {
if (($xmlfile.Файл.ИнфПолФХЖ1.ChildNodes).идентиф -notcontains $id) {
$newElement = $xmlfile.CreateElement("ТекстИнф")
$newElementAdd = $xmlfile.Файл.ИнфПолФХЖ1.AppendChild($newElement)
$newElementAttribute = $newElementAdd.SetAttribute("Идентиф","$id")
$newElementAttribute = $newElementAdd.SetAttribute("Значен","$value")
}
}

foreach ($file in dir C:\temp\in\*.xml) {

$xmlfile = [xml](gc $file.fullname)

Add-XmlElement -id "номер_тк" -value "0146"
Add-XmlElement -id "код_получателя" -value "s"

$xmlfile.Save($file.fullname)

}

Angel79
31-05-2024, 13:57
Большущее тебе спасибо!

Angel79
31-05-2024, 14:52
Очень странная ситуация.
С тем файликом что я прикреплял всё в порядке , а вот с реальным есть проблема.
Вот реальный файлик

DJ Mogarych
31-05-2024, 15:52
Ну вполне естественно, структура разная.


function Add-XmlElement ($id,$value) {
if (($xmlfile.Файл.Документ.СвСчФакт.ИнфПолФХЖ1.ChildNodes).идентиф -notcontains $id) {
$newElement = $xmlfile.CreateElement("ТекстИнф")
$newElementAdd = $xmlfile.Файл.Документ.СвСчФакт.ИнфПолФХЖ1.AppendChild($newElement)
$newElementAttribute = $newElementAdd.SetAttribute("Идентиф","$id")
$newElementAttribute = $newElementAdd.SetAttribute("Значен","$value")
}
}




© OSzone.net 2001-2012