Что нового

[Данные, строки] Парсинг xml, в чём ошибка?

blazzed

Новичок
Сообщения
3
Репутация
0
Добрый день, искал похожие темы, но внятного ответа не нашёл :(
возникла необходимость получить данные из .xml файла
Структура файла:
Код:
....<summary>
<![CDATA[
Text
]]>
</summary>
<content>
<![CDATA[
Text
]]>
<![CDATA[
Text
]]>
</content>...

Нужно получить Text без тегов... Пробовал через StringRegExp, но не получается никак правильно составить шаблон :(

В чём ошибка?
Вот мой код:
Код:
func get()
$artist = 'sting'
$last_xml = 'http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist='& $artist &'&lang=ru&api_key=b25b959554ed76058ac220b7b2e0a026'
$last_Sourse = InetRead($last_xml, 1)
$las_Sourse = BinaryToString($last_Sourse, 4)
$text1 = StringRegExp($las_Sourse, '<!\[CDATA\[(.*?)\]\]>(.*?)<!\[CDATA\[(.*?)\]\]>(.*?)<!\[CDATA\[(.*?)\]\]>(.*?)', 3)

_ArrayDisplay($text1)

EndFunc
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
blazzed
Попробуйте так:
Код:
#include 'array.au3'

$artist = 'sting'
$last_xml = 'http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist='& $artist &'&lang=ru&api_key=b25b959554ed76058ac220b7b2e0a026'
$oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oHTTP.Open('GET', $last_xml, False)
$oHTTP.Send('')
$oHTTP.WaitForResponse
$sHTML = $oHTTP.ResponseText


$string = StringRegExp($sHTML, '(?si)<content>(.*?)</content>',3)
$string2 = StringRegExp($string[0], '(?si)(.*)<a.+?>(.*)</a>(.*)',3)
_ArrayDisplay($string2)
Local $rstring
For $i= 0 To UBound ($string2)  -1
$rstring = $rstring  &$string2 [$i]
Next


Local $rstring1
$string3 = StringRegExp($rstring, '(.+)<.+?>(.*)</.*?>(.+)',3)
While 1
	$rstring1 = ''
For $i= 0 To UBound ($string3)  -1
$rstring1 = $rstring1  &$string3 [$i]
Next
$string3 = StringRegExp($rstring1, '(.+)<.+?>(.*)</.*?>(.+)',3)
If $string3 = 1 Then ExitLoop
WEnd

$string = StringRegExp($rstring1, '(.+)&quot;(.*)',3)
While 1
	$rstring1 = ''
For $i= 0 To UBound ($string)  -1
$rstring1 = $rstring1  &$string [$i]
Next
$string = StringRegExp($rstring1, '(.+)&quot;(.*)',3)
If $string = 1 Then ExitLoop
WEnd

FileWrite ("info.txt", $rstring1)

Получился большой код :( но по другому не еще не умею :whistle:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
blazzed [?]
Нужно получить Text
Код:
$sArtist = 'sting'
$sSkinXMLUrl = 'http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist='& $sArtist &'&lang=ru&api_key=b25b959554ed76058ac220b7b2e0a026'

$oXMLHTTP = _XMLHTTPCreate()
$oDOM = _XMLHTTPOpen($oXMLHTTP, $sSkinXMLUrl)
ConsoleWrite('-> <summary>' & @CR & _XMLParse($oDOM, '//summary') & @CR & '-> </summary>' & @CR & @CR)
ConsoleWrite('-> <content>' & @CR & _XMLParse($oDOM, '//content') & @CR & '-> </content>' & @CR)

Func _XMLHTTPCreate()
    
    Local $oXMLHTTP, $sXMLHTTP
    Local $aXMLHTTP[4] = ["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"]

    For $sXMLHTTP In $aXMLHTTP
        $oXMLHTTP = ObjCreate($sXMLHTTP)
        If IsObj($oXMLHTTP)Then
            Return SetError(0, 0, $oXMLHTTP)
        EndIf
    Next
	
    Return SetError(1, 0, 0)
EndFunc;==>_XMLHTTPCreate

Func _XMLHTTPOpen(ByRef $o_Obj, $s_URL)
    
    If Not IsObj($o_Obj) Then
        Return SetError(1, 0, 0)
    EndIf
    
    With $o_Obj
        .Open("GET", $s_URL, 0)
        .Send()
    EndWith
	
	$o_DOMDocument = $o_Obj.ResponseXML
	$o_DOMDocument.async = False
	$o_DOMDocument.setProperty('SelectionLanguage', 'XPath')
    Return SetError(0, 0 , $o_DOMDocument)

EndFunc;==>_XMLHTTPOpen

Func _XMLParse(ByRef $o_DOM, $s_XPath)
	
	Local $sRet = ''
	$o_DOMNodeList = $o_DOM.selectNodes($s_XPath)

	If Not $o_DOMNodeList.length Then
		Return SetError(1, 0, 0)
	EndIf
	
	For $i = 0 To $o_DOMNodeList.length -1
		$sRet &= $o_DOMNodeList.item($i).text
	Next
	
	Return SetError(0, 0, $sRet)
EndFunc ;==>_XMLParse
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
А Так ?
Код:
#include<Array.au3>
$artist = 'sting'
$last_xml = 'http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist='& $artist &'&lang=ru&api_key=b25b959554ed76058ac220b7b2e0a026'
$last_Sourse = InetRead($last_xml, 1)
$las_Sourse = BinaryToString($last_Sourse, 4)

$sPatern = "(?si)!\[CDATA\[\r?\n?(.*?)\r?\n?\]"
$aResult = StringRegExp( $las_Sourse, $sPatern, 3 )
_ArrayDisplay($aResult)
 
Автор
B

blazzed

Новичок
Сообщения
3
Репутация
0
Garrett спасибо, всё работает... сейчас буду разбираться что к чему... :scratch:
 
Верх