Что нового

Выборка данных из Firebird

Vini

Новичок
Сообщения
27
Репутация
0
Всем привет!
Уважаемые знатоки, подскажите, пожалуйста!
Имеется база Firebird, необходимо выбрать из неё несколько строк
Следующий скрипт возвращает только структуру таблицы полученных строк в XML

Код:
#include <FireBird.au3>
Global $h_fbDll = DllOpen(@ScriptDir & "\fbdll4vb20.dll")
Global $servername="127.0.0.1"
Global $sDBName=@ScriptDir&"/BASE.FDB"
Local $sUsername = "sysdba"
Local $sPassword = "masterkey"
Local $rv, $result
			$rv = _FireBird_ConnectDatabase($h_fbDll, $servername, $sDBName, $sUsername, $sPassword)
			;MsgBox(0,'',$rv)
			If $rv Then
			$rcount = _FireBird_ExecuteSelect($h_fbDll,"SELECT STRING FROM BARCODES WHERE BARCODE>'22'", $result)

				FileWrite(@ScriptDir & "\test.xml", $result)

			_FireBird_DisConnectDatabase($h_fbDll)

			EndIf


Результат:

Код:
<results>
  <metadata>
    <fields>
      <name value="STRING" alias="STRING" type="5" size="20" scale="0" />
    </fields>
  </metadata>
  <data>
    <row num="1" >
      <STRING>
      <![CDATA[String3]]>
      </STRING>
    </row>
    <row num="2" >
      <STRING>
      <![CDATA[String4]]>
      </STRING>
    </row>
  </data>
</results>

Помогите, пожалуйста, разобраться как полученные данные из секций CDATA (String3, String4 и другие, если будут)поместить в массив.
Есть библиотека _XMLDomWrapper.au3, но насколько я понял, она не может обрабатывать секции CDATA

Вот ссылка на архив с проектом (размер большой) http://yadi.sk/d/y5S00Lv_Ko2pv
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Ну почему не обрабатывает CDATA... обрабатывает.

Используй:
Код:
_XMLGetValue


Пример:
Код:
#include <Array.au3>
#include <_XMLDomWrapper.au3>

$sXmlFile ="_autoit_16373.xml"
$oXml = _XMLFileOpen($sXmlFile)

$oXMLGetValue = _XMLGetValue('//results/data/row/STRING')

_ArrayDisplay($oXMLGetValue)


Результат:
Код:
Row|Col 0
[0]|6
[1]|
	  
[2]|String3
[3]|
	  
[4]|
      
[5]|String4
[6]|

ЗЫ: в файле _autoit_16373.xml переписан твой результат.

Правда выдает "пустые" элементы, но в них просто пробелы и переход на новую строку

Пример:
Код:
#include <Array.au3>
#include <_XMLDomWrapper.au3>

$sXmlFile ="_autoit_16373.xml"
$oXml = _XMLFileOpen($sXmlFile)


$oXMLGetValue = _XMLGetValue('//results/data/row/STRING')

    $i = 1
    While 1
        $oXMLGetValue[$i] = StringStripWS($oXMLGetValue[$i], 4) ;~ 4 = удаляет повтор (или многократный повтор) пробельных символов в строке
        If $oXMLGetValue[$i] = @LF Then ;~ @LF = Символ перевода строки, Chr(10)
            _ArrayDelete($oXMLGetValue, $i)
        Else
            $i += 1
        EndIf
         If UBound($oXMLGetValue) <= $i Then ExitLoop
    WEnd
$oXMLGetValue[0] = UBound($oXMLGetValue) - 1
_ArrayDisplay($oXMLGetValue)


Результат:
Код:
Row|Col 0
[0]|2
[1]|String3
[2]|String4



В _XMLDomWrapper.au3 найди функцию _XMLGetValue (у меня 444 строка)
В ней есть строки
Код:
If $objNodeChild.nodeType = $NODE_CDATA_SECTION Then
							_XMLArrayAdd($arrResponse, $objNodeChild.data)
							_DebugWrite("GetValue>CData:" & $objNodeChild.data)
						ElseIf $objNodeChild.nodeType = $NODE_TEXT Then
							_XMLArrayAdd($arrResponse, $objNodeChild.Text)
							_DebugWrite("GetValue>Text:" & $objNodeChild.Text)
						EndIf

Как я понимаю - это и есть обработка на "тест" или "cdata"
 
Автор
V

Vini

Новичок
Сообщения
27
Репутация
0
Хм.. Пробовал, но выдавало ерунду. Плюс улетел :smile:
Тогда назревает вопрос: можно ли избавиться от промежуточных манипуляций с файлом?
т.е. как видно из первого поста первоначально структура XML содержится в переменной
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Да, конечно, можно.

PS: как я понял у тебя результат записывается в переменную $result - если так оно и есть:

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

Global $h_fbDll = DllOpen(@ScriptDir & "\fbdll4vb20.dll")
Global $servername="127.0.0.1"
Global $sDBName=@ScriptDir&"/BASE.FDB"
Local $sUsername = "sysdba"
Local $sPassword = "masterkey"
Local $rv, $result

	$rv = _FireBird_ConnectDatabase($h_fbDll, $servername, $sDBName, $sUsername, $sPassword)
;~ 	MsgBox(0,'',$rv)
	
	If $rv Then
		$rcount = _FireBird_ExecuteSelect($h_fbDll,"SELECT STRING FROM BARCODES WHERE BARCODE>'22'", $result)
;~ 			FileWrite(@ScriptDir & "\test.xml", $result)
			_XMLLoadXML($result)
			$oXMLGetValue = _XMLGetValue('//results/data/row/STRING')

			$i = 1
			While 1
				$oXMLGetValue[$i] = StringStripWS($oXMLGetValue[$i], 4) ;~ 4 = удаляет повтор (или многократный повтор) пробельных символов в строке
				If $oXMLGetValue[$i] = @LF Then ;~ @LF = Символ перевода строки, Chr(10)
					_ArrayDelete($oXMLGetValue, $i)
				Else
					$i += 1
				EndIf
				If UBound($oXMLGetValue) <= $i Then ExitLoop
			WEnd
			$oXMLGetValue[0] = UBound($oXMLGetValue) - 1
			_ArrayDisplay($oXMLGetValue)
			
		_FireBird_DisConnectDatabase($h_fbDll)
	EndIf

PS: там суть в том, что
  • для чтения из файлов используется функция _XMLFileOpen
  • а если у тебя результат в переменной используем функцию _XMLLoadXML

PSS: только вот не знаю как там с переходом на новую строку: с моем примере отловил @LF (он же Chr(10)) - а в переменной может быть @CR (он же Chr(13)), или вообще все вместе @CRLF (@CR & @LF;). Можно еще проверок "до кучи" поставить, но думаю с проверками сам догадаешься. Хотя пиши - если что :beer:
 
Автор
V

Vini

Новичок
Сообщения
27
Репутация
0
а _XMLLoadXML ночью-то я и не заметил :smile:
 
Верх