Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск строки по слову и добавление двух новых строк после найденой. (http://forum.oszone.net/showthread.php?t=355333)

Angel79 31-05-2024 11:24 3027745

Поиск строки по слову и добавление двух новых строк после найденой.
 
Вложений: 2
Здравствуйте.

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

<?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"/>

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

HTML код:

<?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 3027748

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-t...ing-powershell

Angel79 31-05-2024 12:32 3027749

Круто всё работает.
А как сделать чтоб замена прошла по всем XML файлам c разными именами в определённой папке.

DJ Mogarych 31-05-2024 13:12 3027751

Добавил, чтобы один и тот же 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 3027752

Большущее тебе спасибо!

Angel79 31-05-2024 14:52 3027757

Вложений: 1
Очень странная ситуация.
С тем файликом что я прикреплял всё в порядке , а вот с реальным есть проблема.
Вот реальный файлик

DJ Mogarych 31-05-2024 15:52 3027763

Ну вполне естественно, структура разная.

Код:

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")
    }
}



Время: 01:34.

Время: 01:34.
© OSzone.net 2001-