Что нового

пример работы с теговым деревом в библиотеке _XMLDomWrapper

nsgenn

Новичок
Сообщения
52
Репутация
1
День добрый!
Имеется вот такое дерево. Количество блоков usr может быть и больше. Необходимо сделать к примеру выборку фамилий, по условию: idus = 1
[hide]
<usr>
<idus>2</idus>
<fio>Иванов</fio>
<name>Иван</name>
<oth>Иванович</oth>
<spc>ведущий специалист</spc>
<sni>001001</sni>
<gos>-1</gos>
<swor>2</swor>
</usr>
<usr>
<idus>1</idus>
<fio>Петров</fio>
<name>Петр</name>
<oth>Петрович</oth>
<spc>Специалист 1 категории</spc>
<sni>41231222231</sni>
<gos>123</gos>
<swor>1</swor>
</usr>
[/hide]
перелопатил материала, попробовал разные способы, но постоянно возникают разного рода ошибки.
делал так:

Код:
#include <_XMLDomWrapper.au3>

$x = @ScriptDir & "\user.xml"
$y=_XMLFileOpen($x)
$aValue = _XMLGetValue('//usr[idus="1"]/fio')


но опять же: ошибка. Помогите пожалуйста.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
А так не подойдёт?
Код:
$hFile = FileOpen(@ScriptDir & "\test.txt")
If Not @error Then
	$sTest = FileRead($hFile)
	FileClose($hFile)
	$idus = InputBox("Поиск пользователя по ID", "Введите ID пользователя", "1", "",100, 20)
	$aFIO = StringRegExp($sTest, "(?si)<idus>" & $idus & "<.*?<fio>(.*?)<", 3)
	If IsArray($aFIO) Then
		For $i = 0 To UBound($aFIO) - 1    ; Если ID уникальный, то цикл можно не делать
			ConsoleWrite($aFIO[$i] & @LF)
		Next
	Else
		ConsoleWrite("Нет такого ID" & @LF)
	EndIf
Else
	ConsoleWrite('Невозможно открыть файл' & @LF)
EndIf

Да простят меня профи, но я только учусь :smile:
 
Автор
N

nsgenn

Новичок
Сообщения
52
Репутация
1
edyapd сказал(а):
А так не подойдёт?
Да простят меня профи, но я только учусь :smile:
спасибо большое за ответ, но хотелось бы все-таки разобраться в функциональности той библиотеки
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
nsgenn [?]
но хотелось бы все-таки разобраться в функциональности той библиотеки
Чего тут разбираться, читайте доки или описание самой функции. Всего и делов-то!
Код:
#include <Array.au3>
#include <_XMLDomWrapper.au3>

$x = @ScriptDir & "\user.xml"
$y =_XMLFileOpen($x)
$aValue = _XMLGetValue('//usr[idus="1"]/fio')
_ArrayDisplay($aValue)
 
Автор
N

nsgenn

Новичок
Сообщения
52
Репутация
1
Garrett сказал(а):
nsgenn [?]
но хотелось бы все-таки разобраться в функциональности той библиотеки
Чего тут разбираться, читайте доки или описание самой функции. Всего и делов-то!
Код:
#include <Array.au3>
#include <_XMLDomWrapper.au3>

$x = @ScriptDir & "\user.xml"
$y =_XMLFileOpen($x)
$aValue = _XMLGetValue('//usr[idus="1"]/fio')
_ArrayDisplay($aValue)

Все это хорошо, когда есть только один блок <usr>
как только появляется второй, то ничего не работает


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

nsgenn сказал(а):
Все это хорошо, когда есть только один блок <usr>
как только появляется второй, то ничего не работает

тупо возвращает -1, при попытке чтения. Даже не знаю, что делать ((


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

из темы: помоги себе сам.
вот решение какое нашел:

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

$GroupXML = _XMLFileOpen(@ScriptDir & "\export.xml")

$sRoot = "UserGroupList"
$aChilds = _XMLGetChildText($sRoot)
_ArrayDisplay($aChilds)

Dim $aName[1], $aValue[1]


For $i = 1 To UBound($aChilds)-1
    $aAttribs = _XMLGetAllAttribIndex($sRoot & "/" & $aChilds[$i], $aName, $aValue, "", $i-1)
	_ArrayDisplay($aAttribs)
Next

изменил структуру на такую:

Код:
<?xml version="1.0"?>
<UserGroupList>
	<UserGroupItem FAM="Петров" usr="1"/>
	<UserGroupItem NAM="Петр" usr="1"/>
	<UserGroupItem OTC="Петрович" usr="1"/>
	<UserGroupItem FAM="Иванов" usr="2"/>
	<UserGroupItem NAM="Иван" usr="2"/>
	<UserGroupItem OTC="Иванович" usr="2"/>	
</UserGroupList>
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
nsgenn [?]
изменил структуру на такую:
Я бы посоветовал вам следующую структуру:
XML:
<?xml version="1.0" encoding="utf-8"?>
<userlist>
	<user id="2" group="carpenter">
		<fio>Иванов</fio>
		<name>Иван</name>
		<oth>Иванович</oth>
		<spc>ведущий специалист</spc>
		<sni>001001</sni>
		<gos>-1</gos>
		<swor>2</swor>
	</user>
	<user id="1" group="plumber">
		<fio>Петров</fio>
		<name>Петр</name>
		<oth>Петрович</oth>
		<spc>Специалист 1 категории</spc>
		<sni>41231222231</sni>
		<gos>123</gos>
		<swor>1</swor>
	</user>
</userlist>

Что касаемо вашего документа описанного в первом посту:
то ничего не работает
Код:
#include <Array.au3>
#include <_XMLDomWrapper.au3>

$x = @ScriptDir & "\user.xml"
$y =_XMLFileOpen($x)
$aValue = _XMLGetValue('//usr/idus[text()="1"]/following-sibling::fio') ; Петров
_ArrayDisplay($aValue)
$aValue = _XMLGetValue('//usr/idus[text()="2"]/following-sibling::fio') ; Иавнов
_ArrayDisplay($aValue)
 
Автор
N

nsgenn

Новичок
Сообщения
52
Репутация
1
Timothyfib сказал(а):
нашел ваш пост на autoit-script.ru - отправил в закладки

Если интересно, могу свои наработки выложить:

_NewField($s_User, $d_User2) - Создать новую структуру. $s_User - Массив полей. $s_User2 - Массив данных.
_DelField("1") - удалить структуру с ID = №1.
_UpField("1", $s_User, $d_User) - обновить для структуры №1 данные. $s_User - Массив полей. $d_User - Массив данных.
_GetField("2") - получить массив структуры №2

правда код очень-очень сырой. Вероятно полно костылей, но работает без сбоев.

структура XML:

Код:
<?xml version="1.0" encoding="utf-8"?>
<grouplist count="2">
	<group id="2" group="carpenter">
		<fio>Иванов</fio>
		<name>Сидр</name>
		<oth>Геннадьевич</oth>
		<spc>Главный специалист</spc>
		<sni>123654</sni>
		<gos>0101</gos>
		<swor>2</swor>
	</group>
	<group id="1" group="carpenter">
		<fio>Петров</fio>
		<name>Сергей</name>
		<oth>Иванович</oth>
		<spc>специалист 1 категории</spc>
		<sni>031-062-474 94</sni>
		<gos>Qes3gs</gos>
		<swor>1</swor>
	</group>
</grouplist>

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


	$x = @ScriptDir & "\id_cd.xml"
	$y =_XMLFileOpen($x)

	;_NewField($s_User, $d_User2)
	;_DelField("1")
	;_UpField("1", $s_User, $d_User)	
	_ArrayDisplay(_GetField("2"))

	
Func _NewField($struct, $data)

	Local $res
	
	$count = _XMLGetAttrib("/grouplist", "count", "")
	$aChilds = _XMLGetChildText("grouplist")
	$count2= UBound($aChilds)
	$c_str = UBound($struct)
	_XMLCreateChildNode("grouplist" , "group", " ")
	_XMLSetAttrib("grouplist/group["&$count2-1&"]", "id", $count+1) 
	For $i = 0 To $c_str-1
		_XMLCreateChildNode("grouplist/group["&$count2&"]" , $struct[$i], $data[$i])
	Next
	$count+=1
	_XMLSetAttrib("grouplist", "count", $count) 
EndFunc

Func _UpField($id, $what, $than)

	$sRoot = "grouplist"
	Dim $aName[1], $aValue[1]
	$aChilds = _XMLGetChildText($sRoot)
	$c_str = UBound($what)
	
	For $i = 1 To UBound($aChilds)-1
		$aAttribs = _XMLGetAllAttribIndex($sRoot & "/" & $aChilds[$i], $aName, $aValue, "", $i-1)
		if($aValue[0]=$id) Then 
			For $j = 0 To $c_str-1
				_XMLUpdateField("grouplist/group["&$i&"]/"& $what[$j], $than[$j])
			Next
		EndIf
		;_ArrayDisplay($aValue)
	Next
EndFunc

Func _DelField($id)
	$sRoot = "grouplist"
	Dim $aName[1], $aValue[1]
	$aChilds = _XMLGetChildText($sRoot)
	For $i = 1 To UBound($aChilds)-1
		$aAttribs = _XMLGetAllAttribIndex($sRoot & "/" & $aChilds[$i], $aName, $aValue, "", $i-1)
		if($aValue[0]=$id) Then 
			_XMLDeleteNode("/grouplist/group["&$i&"]")		
			ExitLoop;		
		EndIf
	Next
	return 1
EndFunc

Func _GetField($id)
	$sRoot = "grouplist"
	Dim $aName[1], $aValue[1]
	$aChilds = _XMLGetChildText($sRoot)
	Dim $fret[1]
	For $i = 1 To UBound($aChilds)-1
		$aAttribs = _XMLGetAllAttribIndex($sRoot & "/" & $aChilds[$i], $aName, $aValue, "", $i-1)
		
		if($aValue[0]=$id) Then 					
			$aChilds2 = _XMLGetChildText($sRoot & "/" & $aChilds[$i])			
			$count = UBound($aChilds2)
			For $j = 1 To $count-1				
				$tt = _XMLGetField($sRoot & "/" & $aChilds[$i] &"/" & $aChilds2[$j])
				_ArrayAdd($fret, $tt[$i])
			Next
			return $fret			
		EndIf
	Next
	return 1
EndFunc
[/hide]
 
Верх