Что нового

[RegExp] Парсинг XML

Giltor48

Новичок
Сообщения
2
Репутация
0
Добрый день.

Перерыл все темы по XML на форуме, не нашел ответа для себя.
Тело данной XML, сразу скажу, что строк вида <row ... /> может быть куда больше

Код:
<eveapi version="2">
<currentTime>2016-12-05 06:51:55</currentTime>
<result>
<rowset name="members" key="characterID" columns="characterID,name,startDateTime,baseID,base,title,logonDateTime,logoffDateTime,locationID,location,shipTypeID,shipType,roles,grantableRoles">
<row characterID="90033326" name="Ekcio" startDateTime="2015-12-21 15:43:00" baseID="0" base="" title="" logonDateTime="2016-01-12 15:53:52" logoffDateTime="2016-01-12 15:56:03" locationID="61000474" location="2H-TSE II - Space Mining Outpost" shipTypeID="11182" shipType="Cheetah" roles="1017252765660878336" grantableRoles="0"/>
<row characterID="90038231" name="Testicals" startDateTime="2013-10-15 08:28:00" baseID="0" base="" title="Albert Salichov " logonDateTime="2016-11-22 20:04:35" logoffDateTime="2016-11-22 20:30:11" locationID="61000775" location="IOO-7O VIII - shtrafy za mobil depo u stanki " shipTypeID="29984" shipType="Tengu" roles="1016689815170582016" grantableRoles="0"/>
<row characterID="90051651" name="ToN2kk" startDateTime="2016-10-29 22:11:00" baseID="0" base="" title="" logonDateTime="2016-12-03 06:11:33" logoffDateTime="2016-12-03 07:49:02" locationID="61000474" location="2H-TSE II - Space Mining Outpost" shipTypeID="29984" shipType="Tengu" roles="0" grantableRoles="0"/>
<row characterID="90057412" name="Xaaw" startDateTime="2014-04-03 11:22:00" baseID="0" base="" title="" logonDateTime="2016-12-02 14:56:21" logoffDateTime="2016-12-02 19:50:51" locationID="61000474" location="2H-TSE II - Space Mining Outpost" shipTypeID="645" shipType="Dominix" roles="0" grantableRoles="0"/>
<row characterID="90066637" name="SirveLES" startDateTime="2014-11-04 20:09:00" baseID="0" base="" title="" logonDateTime="2016-04-13 03:30:48" logoffDateTime="2016-04-13 03:32:50" locationID="61000474" location="2H-TSE II - Space Mining Outpost" shipTypeID="608" shipType="Atron" roles="1016689815170582016" grantableRoles="0"/>
<row characterID="90074099" name="Urnangu" startDateTime="2015-12-21 23:59:00" baseID="0" base="" title="Alt Sham" logonDateTime="2016-07-24 15:44:02" logoffDateTime="2016-07-24 15:53:39" locationID="60003076" location="Airaken VIII - Expert Housing Production Plant" shipTypeID="11196" shipType="Claw" roles="1016689815170582016" grantableRoles="0"/>
<row characterID="90090846" name="Dancing Joker" startDateTime="2014-03-20 02:15:00" baseID="0" base="" title="" logonDateTime="2016-02-18 16:26:36" logoffDateTime="2016-02-18 16:41:50" locationID="60003760" location="Jita IV - Moon 4 - Caldari Navy Assembly Plant" shipTypeID="587" shipType="Rifter" roles="0" grantableRoles="0"/>
<row characterID="90121495" name="Shamsilisin" startDateTime="2015-12-07 19:36:00" baseID="0" base="" title="" logonDateTime="2016-07-24 15:06:33" logoffDateTime="2016-07-24 15:20:01" locationID="30000225" location="H-5GUI" shipTypeID="11202" shipType="Ares" roles="1016689815170582016" grantableRoles="0"/>
</rowset>
</result>
<cachedUntil>2016-12-05 12:48:55</cachedUntil>
</eveapi>

Необходимо получать данные из name="..." logonDateTime="..." logoffDateTime="..."
Получить их с одной строки получилось следующим выражением:

Код:
$str = StringRegExp($inet,'.*name="(.*?)" .*logonDateTime="(.*?)" .*logoffDateTime="(.*?)"')


А как заставить скрипт читать все строки данной xml?
Заранее спасибо
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include 'array.au3'
$file=ClipGet()
$str=StringRegExp($file,'name="([^"<>]+)[^<>]+logonDateTime="([^"<>]+)[^<>]+logoffDateTime="([^"<>]+)',3)
_ArrayDisplay($str)
 
Автор
G

Giltor48

Новичок
Сообщения
2
Репутация
0
Чуток не додумал, спасибо большое за помощь
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Giltor48 [?]
Чуток не додумал
Да нет, не чуток.
RegExp тут ни при чём. Всё уже придумано до нас.
Код:
#include<Array.au3>

$sXML = '<eveapi version="2">' _
   &'<currentTime>2016-12-05 06:51:55</currentTime>' _
   &'<result>' _
	  &'<rowset name="members" key="characterID" columns="characterID,name,startDateTime,baseID,base,title,logonDateTime,logoffDateTime,locationID,location,shipTypeID,shipType,roles,grantableRoles">' _
		 &'<row characterID="90033326" name="Ekcio" startDateTime="2015-12-21 15:43:00" baseID="0" base="" title="" logonDateTime="2016-01-12 15:53:52" logoffDateTime="2016-01-12 15:56:03" locationID="61000474" location="2H-TSE II - Space Mining Outpost" shipTypeID="11182" shipType="Cheetah" roles="1017252765660878336" grantableRoles="0"/>' _
		 &'<row characterID="90038231" name="Testicals" startDateTime="2013-10-15 08:28:00" baseID="0" base="" title="Albert Salichov " logonDateTime="2016-11-22 20:04:35" logoffDateTime="2016-11-22 20:30:11" locationID="61000775" location="IOO-7O VIII - shtrafy za mobil depo u stanki " shipTypeID="29984" shipType="Tengu" roles="1016689815170582016" grantableRoles="0"/>' _
		 &'<row characterID="90051651" name="ToN2kk" startDateTime="2016-10-29 22:11:00" baseID="0" base="" title="" logonDateTime="2016-12-03 06:11:33" logoffDateTime="2016-12-03 07:49:02" locationID="61000474" location="2H-TSE II - Space Mining Outpost" shipTypeID="29984" shipType="Tengu" roles="0" grantableRoles="0"/>' _
		 &'<row characterID="90057412" name="Xaaw" startDateTime="2014-04-03 11:22:00" baseID="0" base="" title="" logonDateTime="2016-12-02 14:56:21" logoffDateTime="2016-12-02 19:50:51" locationID="61000474" location="2H-TSE II - Space Mining Outpost" shipTypeID="645" shipType="Dominix" roles="0" grantableRoles="0"/>' _
		 &'<row characterID="90066637" name="SirveLES" startDateTime="2014-11-04 20:09:00" baseID="0" base="" title="" logonDateTime="2016-04-13 03:30:48" logoffDateTime="2016-04-13 03:32:50" locationID="61000474" location="2H-TSE II - Space Mining Outpost" shipTypeID="608" shipType="Atron" roles="1016689815170582016" grantableRoles="0"/>' _
		 &'<row characterID="90074099" name="Urnangu" startDateTime="2015-12-21 23:59:00" baseID="0" base="" title="Alt Sham" logonDateTime="2016-07-24 15:44:02" logoffDateTime="2016-07-24 15:53:39" locationID="60003076" location="Airaken VIII - Expert Housing Production Plant" shipTypeID="11196" shipType="Claw" roles="1016689815170582016" grantableRoles="0"/>' _
		 &'<row characterID="90090846" name="Dancing Joker" startDateTime="2014-03-20 02:15:00" baseID="0" base="" title="" logonDateTime="2016-02-18 16:26:36" logoffDateTime="2016-02-18 16:41:50" locationID="60003760" location="Jita IV - Moon 4 - Caldari Navy Assembly Plant" shipTypeID="587" shipType="Rifter" roles="0" grantableRoles="0"/>' _
		 &'<row characterID="90121495" name="Shamsilisin" startDateTime="2015-12-07 19:36:00" baseID="0" base="" title="" logonDateTime="2016-07-24 15:06:33" logoffDateTime="2016-07-24 15:20:01" locationID="30000225" location="H-5GUI" shipTypeID="11202" shipType="Ares" roles="1016689815170582016" grantableRoles="0"/>' _
	  &'</rowset>' _
   &'</result>' _
   &'<cachedUntil>2016-12-05 12:48:55</cachedUntil>' _
&'</eveapi>'

$sFile = @ScriptDir & '\eve.xml'

$oObj = ObjCreate("MSXml2.DOMDocument")
;~ $oObj.load($sFile)
$oObj.LoadXML($sXML)
$oObj.setProperty('SelectionLanguage', 'XPath')
$oNodes = $oObj.selectNodes("//row/@name|//@logonDateTime|//@logoffDateTime")

Local $aData[$oNodes.length/3][3]

$j = -1
For $i = 0 To $oNodes.length -1
   $m = Mod($i, 3)
   If Not $m Then $j +=1
   $aData[$j][$m] = $oNodes($i).text
Next

_ArrayDisplay($aData)
 
Сообщения
50
Репутация
-1
Ваш скрипт записывает построчно втекстовой файл, а как сделать что бы записывал в одну строку?
И еще один момент, если у меня в тегах xml много параметров , но есть два одинаковых поддтега, отличающихя только одним парметром,как их отсортировать?

пример:

Код:
<ELEM PLAYER_ID="OBJID_PLAY_X1" PLAYER_NAME="Плеер" SCH_ID="1" SCH_NAME="Default" STATUS="playing">
<ELEM PLAYER_ID="OBJID_PLAY_X1" PLAYER_NAME="Плеер" SCH_ID="1" SCH_NAME="Default" STATUS="preloaded">

аи в таком случае скрипт берет инфу из них обоих,а нужен,скажем тот у которого параметр STATUS="playing"
 
Верх