Что нового

Редактирование XML файла

Grizli

Новичок
Сообщения
48
Репутация
2
Здравствуйте уважаемые. Не получается у меня отредактировать XML файл.
Нужно пройти весь файл и после каждой строки </pac:lastChanging>
вставить строку </pac:fact> и в конце файла удалить такое количество строк </pac:fact>, какое было расставлено по файлу. Другими словами нужно снизу файла перенести эти строки на свои места, исправить неправильную структуру XML файла. Количество таких замен неизвестно, каждый раз количество их будет разное.
Сам файл прикрепил к сообщению.
У меня проблемы:
не получается найти строку </pac:fact> не могу заэкранировать стрелки и слеш чтобы условие сравнения строк работало(чтобы удалить нужное количество строк </pac:fact> в конце файла их то нужно найти)
при добавлении строки </pac:fact> в файл у него слетает вся структура и он становится неформатированным текстом


ПС: в скрипте так же двигаю строку lastChanging на положенное ей место.
Код:
#NoTrayIcon
#include <File.au3>
#include <Array.au3>
Local $aArray

$hOldFile = FileOpenDialog("Выберите файл", @DesktopDir , " (*.XML)")
_FileReadToArray($hOldFile, $aArray)

$kolich=0

For $n = UBound($aArray) - 1 to 0 Step -1

 If StringInStr( $aArray[$n],"lastChanging") <>0 Then
$kolich+=1
	   ConsoleWrite( $aArray[$n] & $n&@LF)
	   $string=$aArray[$n]
_ArrayDelete($aArray, $n)
_ArrayInsert ($aArray,$n+1,$string)
_ArrayInsert ($aArray,$n+2,'</pac:fact>')
 EndIf
Next
;~ _ArrayDisplay($aArray)
_FileWriteFromArray($hOldFile, $aArray, 1)
FileClose($hOldFile)

Exit
 

Вложения

  • Без имени-1.jpg
    Без имени-1.jpg
    103.7 КБ · Просмотры: 14
  • 4280_10.06.S_016.rar
    854 байт · Просмотры: 4

gunter123

Продвинутый
Сообщения
159
Репутация
69
Зачем вставлять строку </pac:fact>, а потом ее же удалять? :scratch:
после каждой строки </pac:lastChanging>
вставить строку </pac:fact> и в конце файла удалить такое количество строк </pac:fact>, какое было расставлено по файлу

Скиньте, пожалуйста, файл до и после изменения.
 
Автор
G

Grizli

Новичок
Сообщения
48
Репутация
2
вставляется строка в нужное место, удаляется из неправильного в конце файла. в первом сообщении темы на скриншоте стрелкой нарисовал откуда и куда должна перемещаться строка.
файл после правки прикрепил к сообщению.
 

Вложения

  • 4280_10.06.S_016после.rar
    855 байт · Просмотры: 3
  • 4280_10.06.S_016.rar
    854 байт · Просмотры: 2

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Grizli
Не забудьте сделать резервную копию файлов

Код:
$sFilePath = @ScriptDir & "\4280_10.06.S_016 - копия.XML"
If Not FileExists($sFilePath) Then Exit ConsoleWrite("!> Файл не найден" & @CRLF)

$oXML = ObjCreate("Microsoft.XMLDOM")
If Not IsObj($oXML) Then Exit ConsoleWrite("!> Ошибка создания объекта XML" & @CRLF)
$oXML.load($sFilePath)

$oPacElements = $oXML.SelectSingleNode("//pac:elements")
If Not IsObj($oPacElements) Then Exit ConsoleWrite("!> Ошибка поиска элемента <pac:elements>" & @CRLF)

$oPacFacts = $oPacElements.SelectNodes("//pac:fact")
If Not $oPacFacts.length Then Exit ConsoleWrite("!> Элементы <pac:fact> не найдены" & @CRLF)

For $oPF In $oPacFacts
  $oPacElements.appendChild($oPF)
Next

$oXML.save(@ScriptDir & "\test.xml")
 
Автор
G

Grizli

Новичок
Сообщения
48
Репутация
2
InnI
Вы меня не первый раз уже выручаете. Пример отлично работает. Правда для меня сильно непривычный. Если бы я имел два решения своих вопроса то мой код редактирования файла был бы ну не меньше чем в 4 раза больше вашего. Снимаю шляпу.


Код:
For $oPF In $oPacFacts
  $oPacElements.appendChild($oPF)
Next

как эти 3 строчки выбирают нужные строчки удаляют их и добавляют там где нужно.... ?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Grizli [?]
как эти 3 строчки выбирают нужные строчки удаляют их и добавляют там где нужно.... ?
Я не знаю, КАК они это делают. Это проблемы Microsoft. Но я знаю, что метод appendChild сделает ЭТО - удалит и добавит.
 
Автор
G

Grizli

Новичок
Сообщения
48
Репутация
2
Предполагаю идет проверка структуры файла XML и закрытие открытых секций. Это в принципе не сложно. Других вариантов у меня нет.
Но код конечно магический
 
Верх