Что нового

[Данные, строки] Не получается распарсить XML

Pavel

Новичок
Сообщения
125
Репутация
3
Господа, честно пытался. Читал эту тему, но не смог разобраться.
Задача: разбирать по расписанию XML под адресу http://sc2tv.ru/api.php, и вносить полученные данные в sqlite базу.
Проблема в том, что _XMLDomWrapper.au3 в моих кривых руках (видимо) не работает...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Pavel,
Разбирать на какие составляющие?
 
Автор
P

Pavel

Новичок
Сообщения
125
Репутация
3
madmasles, да в принципе можно все поля.

Таблица Stream
Столбцы: ID, title, description, source, started

Таблица Future
Столбцы: ID, title, description, time

Таблица user_streams
Столбцы: ID, user, title, description, link
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
#include <_XMLDomWrapper.au3>
#include <Array.au3>
_XMLFileOpen('http://sc2tv.ru/api.php')
$aStream = _XMLGetValue('//online/stream/*')
_ArrayDisplay($aStream, 'Stream')
$aStreamPreset = _XMLGetValue('//online/stream/preset/*')
_ArrayDisplay($aStreamPreset, 'Stream Preset')
$aFuture = _XMLGetValue('//future/stream/*')
_ArrayDisplay($aFuture, 'Future')
$aUserStreams = _XMLGetValue('//user_streams/stream/*')
_ArrayDisplay($aUserStreams, 'User Streams')
$aNews = _XMLGetValue('//news/item/*')
_ArrayDisplay($aNews, 'News')



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

Если нужно разобрать по отдельности, то вот пример разбора тега <online>
Код:
#include <_XMLDomWrapper.au3>
#include <Array.au3>
_XMLFileOpen('http://sc2tv.ru/api.php')

#Region Online

$aID = _XMLGetValue('//online/stream/id')
_ArrayDisplay($aID, 'title')
$aTitle = _XMLGetValue('//online/stream/title')
_ArrayDisplay($aTitle, 'Title')
$aDescription = _XMLGetValue('//online/stream/description')
_ArrayDisplay($aDescription, 'Description')
$aSource = _XMLGetValue('//online/stream/preset/source')
_ArrayDisplay($aSource, 'Preset Source')
$aEmbed = _XMLGetValue('//online/stream/preset/embed')
_ArrayDisplay($aEmbed, 'Preset Embed')

#EndRegion Online
 
Автор
P

Pavel

Новичок
Сообщения
125
Репутация
3
Дополнительный вопрос: а можно где найти русскую приличную справку/мануал по работе SQLite.au3?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Если работал с БД - русская помощь тебе не нужна, если не работал, то нужна помощь по БД
+ поищи по форуму строку sqlite.au3, основные моменты здесь показывались
 
Автор
P

Pavel

Новичок
Сообщения
125
Репутация
3
Если работал с БД - русская помощь тебе не нужна, если не работал, то нужна помощь по БД
+ поищи по форуму строку sqlite.au3, основные моменты здесь показывались
Вопрос заключается не в том, КАК сделать тото или иной запрос в БД, а КАК ЛУЧШЕ? Ведь можно сделать запрос функциями Autoit, а можно запросами sqlite, как я понимаю.
Как лучше делать выборку из таблиц? Например, есть значение, которое нужно найти в определенном столбце таблицы. Или как лучше переместить строку из одной таблицы в другую?
 

glax24

Знающий
Сообщения
72
Репутация
14
Подскажите как правильно считать все параметры в xml с помощью _XMLDomWrapper.au3
Вся проблема как рекурсивно получить все секции и считать FileName?
В моем случае работает если нет вложений секции это SECTION1 и SECTION2
При обработке 3 ошибка.
Код:
<?xml version="1.0" encoding="windows-1251" ?>
<ROOT>
	<SECTION1>
		<ID FileName="Text1" />
	</SECTION1>
	<SECTION2>
		<ID FileName="Text2" />
	</SECTION2>
	<SECTION3>
		<PODSECTION3>
			<PODSECTION3_1>
				<ID FileName="Text3" />
			</PODSECTION3_1>
			<PODSECTION3_2>
				<ID FileName="Text4" />
			</PODSECTION3_2>
		</PODSECTION3>
	</SECTION3>
</ROOT>
Код:
#include <Array.au3>
#include <_XMLDomWrapper.au3>

Global $GroupXML = _XMLFileOpen(@ScriptDir & '\test.xml')
Global $sRootX = 'ROOT'
Global $aChildsRoot
GetRootXML()
GetTextXML()
;Функция получения дочерних секций
Func GetRootXML()

	$aChildsRoot = _XMLGetChildNodes($sRootX)

	If Not IsArray($aChildsRoot) Then
		MsgBox(4112, 'Ошибка', 'Не удалось считать секции' & $sRootX)
		Exit
	EndIf
	For $i = 1 To $aChildsRoot[0]
		$aChildsRoot[$i] = $sRootX & '/' & $aChildsRoot[$i]
	Next
	_ArrayDisplay($aChildsRoot,'ChildsRoot')
EndFunc   ;==>GetRootXML

Func GetTextXML()
	Local $iCheck
	Dim $aFileName[1] = [0]
	Dim $aChilds
	Dim $aAttribs
	Dim $aName[1], $aValue[1]

	For $iR = 1 To $aChildsRoot[0]

		$aChilds = _XMLGetChildText($aChildsRoot[$iR])
		If @error Then
			ContinueLoop; Если секция пустая
		EndIf
		_ArrayDisplay($aChilds,'Childs')
		;---------------------Поиск FileName------------------------------------
		For $iC = 1 To $aChilds[0]
			$aAttribs = _XMLGetAllAttribIndex($aChildsRoot[$iR] & '/' & $aChilds[$iC], $aName, $aValue, "", $iC - 1)
			If @error Then
				ContinueLoop
			EndIf
			$iCheck = -1
			_ArrayDisplay($aAttribs,'Attribs')
			;Обще количество колонок.
			For $iA = 0 To UBound($aAttribs, 2) - 1
				;Поиск нужного параметра
				If StringCompare("FileName", $aAttribs[0][$iA]) = 0 Then
					$iCheck = $iA
					ExitLoop
				EndIf
			Next
			If $iCheck < 0 Then
				ContinueLoop
			EndIf
			;Записать имя файла в массив
			$aFileName[0] += 1
			ReDim $aFileName[$aFileName[0] + 1]
			$aFileName[$aFileName[0]] = $aAttribs[1][$iCheck]

		Next
	Next
	_ArrayDisplay($aFileName,'FileName')
EndFunc   ;==>GetTextXML
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
glax24
Ненужно Up`ать, вы лучше правила почитайте! ;)
 

glax24

Знающий
Сообщения
72
Репутация
14
Сделал так
Код:
#include <Array.au3>
#include <_XMLDomWrapper_.au3>

Global $GroupXML = _XMLFileOpen(@ScriptDir & '\test.xml')
Global $sRootX = 'ROOT'
Global $aChildsRoot[1] = [0]
GetRootXMLRecurs($sRootX, $aChildsRoot)
;_ArrayDisplay($aChildsRoot, 'ChildsRoot')
GetTextXML()

;Рекурсивная функция получения дочерних секций
Func GetRootXMLRecurs($sRoot, ByRef $_aChildsRoot)

	Local $iNodeCount
	Local $aChildsTmp
	Dim $aName[1], $aValue[1]
	Local $aChilds = _XMLGetChildNodes($sRoot)
	If Not IsArray($aChilds) Then
		;ConsoleWrite('Не удалось считать секцию ' & $sRoot & " error = " & @error & @CRLF)
		Return SetError(1, 0, -1)
	EndIf
	;_ArrayDisplay($aChilds, 'Childs')
	For $i = 1 To $aChilds[0]

		$aChilds[$i] = $sRoot & '/' & $aChilds[$i]
		GetRootXMLRecurs($aChilds[$i], $_aChildsRoot)
		If @error Then
			;Если секция не пустая
			;ConsoleWrite($aChilds[$i] & @CRLF)
			$aChildsTmp = _XMLGetAllAttrib($aChilds[$i] & "[" & $i & "]", $aName, $aValue)
			If Not @error Then
				;_ArrayDisplay($aChildsTmp, $aChilds[$i] & " " & $i)
				$_aChildsRoot[0] += 1
				ReDim $_aChildsRoot[$_aChildsRoot[0] + 1]
				$_aChildsRoot[$_aChildsRoot[0]] = $sRoot
				ExitLoop
			EndIf
		EndIf
	Next

EndFunc   ;==>GetRootXMLRecurs

Func GetTextXML()
	Local $iCheck
	Dim $aFileName[1] = [0]
	Dim $aChilds
	Dim $aAttribs
	Dim $aName[1], $aValue[1]

	For $iR = 1 To $aChildsRoot[0]

		$aChilds = _XMLGetChildText($aChildsRoot[$iR])
		If @error Then
			ContinueLoop; Если секция пустая
		EndIf
		;_ArrayDisplay($aChilds, $aChildsRoot[$iR])
		;---------------------Поиск FileName------------------------------------
		For $iC = 1 To $aChilds[0]
			ConsoleWrite($iC - 1 & "  " & $aChildsRoot[$iR] & '/' & $aChilds[$iC] & @CRLF)
			;$aAttribs = _XMLGetAllAttribIndex($aChildsRoot[$iR] & '/' & $aChilds[$iC], $aName, $aValue, "", $iC - 1)
			$aAttribs = _XMLGetAllAttrib($aChildsRoot[$iR] & '/' & $aChilds[$iC] & "[" & $iC & "]", $aName, $aValue)
			If @error Then
				ContinueLoop
			EndIf
			;_ArrayDisplay($aAttribs, 'Attribs')

			$iCheck = -1
			;Обще количество колонок.
			For $iA = 1 To $aAttribs[0][0]
				;Поиск нужного параметра
				If StringCompare("FileName", $aAttribs[0][$iA]) = 0 Then
					$iCheck = $iA
					ExitLoop
				EndIf
			Next

			If $iCheck < 0 Then
				ContinueLoop
			EndIf
			;Записать имя файла в массив
			$aFileName[0] += 1
			ReDim $aFileName[$aFileName[0] + 1]
			$aFileName[$aFileName[0]] = $aAttribs[1][$iCheck]

		Next
	Next
	_ArrayDisplay($aFileName, 'FileName')
EndFunc   ;==>GetTextXML
 
Верх