Что нового

Изменение в XML файле

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
Мой файл:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<Rights xmlns="http://v8.1c.ru/8.2/roles" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Rights">
	<setForNewObjects>true</setForNewObjects>
	<setForAttributesByDefault>true</setForAttributesByDefault>
	<independentRightsOfChildObjects>true</independentRightsOfChildObjects>
	<object>
		<name>Report.ОстаткиПоСкладу.Attribute.РежимРасшифровки</name>
		<right>
			<name>View</name>
			<value>true</value>
		</right>
		<right>
			<name>Edit</name>
			<value>true</value>
		</right>
	</object>
	<object>
		<name>Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Команды.Attribute.ПоказыватьОповещение</name>
		<right>
			<name>View</name>
			<value>true</value>
		</right>
		<right>
			<name>Edit</name>
			<value>true</value>
		</right>
	</object>
	<object>
		<name>Catalog.ПерепискаСКонтролирующимиОрганами.Attribute.ДатаСообщения</name>
		<right>
			<name>View</name>
			<value>true</value>
		</right>
		<right>
			<name>Edit</name>
			<value>true</value>
		</right>
	</object>
</Rights>

Пытаюсь читать:

#include <_XMLDomWrapper.au3>
#include <Array.au3>
Код:
_XMLFileOpen("C:\Users\путь\Роль.ПолныеПрава.Права_1.xml")
$str = "//?/object/value"
$res = _XMLGetValue($str)
_ArrayDisplay($res)


Что мне указать вместо ? прошу помощи.

моя конечная цель изменить
<value>true</value>
для
<name>Catalog.ПерепискаСКонтролирующимиОрганами.Attribute.ДатаСообщения</name>
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Re: Изменение в XML файле с помощью _XMLDomWrapper.au3

/Rights/object[3]/right[1]/value/text()
это?
 
Автор
A

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
Re: Изменение в XML файле с помощью _XMLDomWrapper.au3

Да именно




С таким файлом:

Код:
<?xml version="1.0" encoding="UTF-8"?>
<Rights>
	<setForNewObjects>true</setForNewObjects>
	<setForAttributesByDefault>true</setForAttributesByDefault>
	<independentRightsOfChildObjects>true</independentRightsOfChildObjects>
	<object>
		<name>Report.ОстаткиПоСкладу.Attribute.РежимРасшифровки</name>
		<right>
			<name>View</name>
			<value>true</value>
		</right>
		<right>
			<name>Edit</name>
			<value>true</value>
		</right>
	</object>
	<object>
		<name>Catalog.ДополнительныеОтчетыИОбработки.TabularSection.Команды.Attribute.ПоказыватьОповещение</name>
		<right>
			<name>View</name>
			<value>true</value>
		</right>
		<right>
			<name>Edit</name>
			<value>true</value>
		</right>
	</object>
	<object>
		<name>Catalog.ПерепискаСКонтролирующимиОрганами.Attribute.ДатаСообщения</name>
		<right>
			<name>View</name>
			<value>true</value>
		</right>
		<right>
			<name>Edit</name>
			<value>true</value>
		</right>
	</object>
</Rights>

код работает:
Код:
_XMLFileOpen("C:\Users\путь\Роль.ПолныеПрава.Права_1.xml")
$str = "//Rights/object/right/value"
$res = _XMLGetValue($str)
_ArrayDisplay($res)


а как написать код, что бы читал в файле, который выше? помогите.


Добавлено:
Сообщение автоматически объединено:


продолжаю просить о помощи!

упростил код:

Код:
<root 1>
	<object>
		<right>
			<value>true</value>
		</right>
	</object>
	<object>
		<right>
			<value>false</value>
		</right>
	</object>
</root>

Код:
#include <_XMLDomWrapper.au3>
#include <Array.au3>

_XMLFileOpen("C:\Users\Права\test.xml")

$str = "//root/object/right/value"

MsgBox(0,"",_XMLNodeExists($str))

$res = _XMLGetValue($str)
_ArrayDisplay($res)


в xml файле <root 1> и
строка $str = "//root/object/right/value" уже не верная
строка $str = "//root 1/object/right/value" тоже не работает.
Как правильно написать?


Добавлено:
Сообщение автоматически объединено:

Решено, решение нашел на http://autoit-script.ru/index.php?topic=10864.0


Добавлено:
Сообщение автоматически объединено:

Тема решена только на половину, только чтение.

Теперь прошу помочь в изменении в xml файле

сам файл:

Код:
<?xml version="1.0" encoding="UTF-8"?>
<Rights xmlns="http://v8.1c.ru/8.2/roles" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Rights">
	<setForNewObjects>true</setForNewObjects>
	<setForAttributesByDefault>true</setForAttributesByDefault>
	<independentRightsOfChildObjects>true</independentRightsOfChildObjects>
	<object>
		<name>Report</name>
		<right>
			<name>View</name>
			<value>true</value>
		</right>
		<right>
			<name>Edit</name>
			<value>true</value>
		</right>
	</object>
	<object>
		<name>Catalog</name>
		<right>
			<name>View</name>
			<value>true</value>
		</right>
		<right>
			<name>Edit</name>
			<value>true</value>
		</right>
	</object>
</Rights>

сам скрипт:


Код:
$D =  FileOpen("C:\Users\Desktop\Instrument\Права\test.xml", 128)
$vTest = FileRead($D)

$oXML = ObjCreate("Msxml2.DOMDocument.3.0")
$oXML.LoadXML($vTest)

$oValutes = $oXML.SelectNodes("Rights/object/right")
For $oValute In $oValutes
   $sValue = $oValute.SelectSingleNode("value").Text
   $oValute.ReplaceChild(1111,$sValue)
Next
$oXML.Save($vTest)

FileDelete("C:\Users\Desktop\Instrument\Права\test_1.xml")
$hFile = FileOpen("C:\Users\Desktop\Instrument\Права\test_1.xml", 128+1)
FileWrite($hFile, $vTest)
$vTest =  FileRead("C:\Users\Desktop\Instrument\Права\test_1.xml")
MsgBox(0,"",$vTest)
FileClose($D)


строкой $oValute.ReplaceChild(1111,$sValue)

пытаюсь изменить часть файла на 1111

строкой $oXML.Save($vTest)

пытаюсь записать изменения в строку $vTest

что не так делаю, как после найденного участка файла xml изменить его?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
$oXML = ObjCreate("Msxml2.DOMDocument.3.0")
$oXML.Load("test.xml")

$oAll = $oXML.SelectNodes("//right/value")
For $oEl In $oAll
   $oEl.Text = 1111
Next

MsgBox(0, "", $oXML.xml)
 
Автор
A

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
Garrett сказал(а):
Код:
$oXML = ObjCreate("Msxml2.DOMDocument.3.0")
$oXML.Load("test.xml")

$oAll = $oXML.SelectNodes("//right/value")
For $oEl In $oAll
   $oEl.Text = 1111
Next

MsgBox(0, "", $oXML.xml)


спасибо работает
А как теперь результат записать в файл?
 

XpycT

Скриптер
Сообщения
380
Репутация
133
AlexxxMksv
Код:
$oXML = ObjCreate("Msxml2.DOMDocument.3.0")
$oXML.Load(@ScriptDir & "\file_org.xml")

$oObjects = $oXML.SelectNodes("Rights/object")
If $oXML.ParseError.ErrorCode <> 0 Then Exit 99 * 0 + ConsoleWrite("$oXML.SelectNodes | Error > " & $oXML.ParseError.Reason & @CR)

For $oObject In $oObjects
	If $oObject.SelectSingleNode("name").Text = "Catalog.ПерепискаСКонтролирующимиОрганами.Attribute.ДатаСообщения" Then
		$oObject.SelectSingleNode("right/value").Text = "True"
	EndIf
Next

$oXML.Save(@ScriptDir & "\file_new.xml")
 
Автор
A

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
XpycT сказал(а):
AlexxxMksv
Код:
$oXML = ObjCreate("Msxml2.DOMDocument.3.0")
$oXML.Load(@ScriptDir & "\file_org.xml")

$oObjects = $oXML.SelectNodes("Rights/object")
If $oXML.ParseError.ErrorCode <> 0 Then Exit 99 * 0 + ConsoleWrite("$oXML.SelectNodes | Error > " & $oXML.ParseError.Reason & @CR)

For $oObject In $oObjects
	If $oObject.SelectSingleNode("name").Text = "Catalog.ПерепискаСКонтролирующимиОрганами.Attribute.ДатаСообщения" Then
		$oObject.SelectSingleNode("right/value").Text = "True"
	EndIf
Next

$oXML.Save(@ScriptDir & "\file_new.xml")

Мне этот вариант максимально подходит, но:
с помощью Метода SelectSingleNode можно заменить только первый попавшийся ("right/value"), а если их там несколько - как в моем варианте? как заменить все?

Т. Е в блоке где
$oObject.SelectSingleNode("name").Text = "Catalog.ПерепискаСКонтролирующимиОрганами.Attribute.ДатаСообщения"

есть несколько ("right/value"), их надо все заменить или выборочно



Добавлено:
Сообщение автоматически объединено:

Спасибо, подумал еще раз и догадался:
Код:
#include <Array.au3>

$oXML = ObjCreate("Msxml2.DOMDocument.3.0")
$oXML.Load("C:\Users\Makosov_A\Desktop\Instrument\Права\test.xml")

;$oAll = $oXML.SelectNodes("//right/value")
;For $oEl In $oAll
;   $oEl.Text = 1111
;Next

$oObjects = $oXML.SelectNodes("Rights/object")
If $oXML.ParseError.ErrorCode <> 0 Then MsgBox(0,"","В файле нет поля object")

For $oObject In $oObjects

   If $oObject.SelectSingleNode("name").Text = "Catalog" Then
	  $values = $oObject.SelectNodes("right/value")
	  For $value In $values

		 $value.Text = 1111
	  Next

   EndIf

Next

$oXML.Save("C:\Users\Makosov_A\Desktop\Instrument\Права\test1.xml")
 
Верх