Jump to content
Sign in to follow this  
gcue

XML help

Recommended Posts

gcue

I have an XML i cannot read the values from. The examples I've hashed through in this forum have been <label>value</label> format

The XML i have is more like <label child_labelA="value1" child_labelB="value2". And in some cases the child label "name" is repeated

<?xml version="1.0" encoding="UTF-8" ?><Drives clsid="{8FDDDC1A-0C3C-43cd-A6B4-71A6D8C}">
<Drive clsid="{935DB-9CB8-4e3c-9914-7D57A47}" name="P:" status="P:" image="1" changed="2011-01-06 19:39:04" uid="{DDB66416-D9D6-4A8C-ADEC-4190332465}" bypassErrors="1" policyApplied="1">
<Properties action="R" thisDrive="NOCHANGE" allDrives="NOCHANGE" userName="" path="\\apps" label="Apps" persistent="1" useLetter="1" letter="P"></Properties>
<Filters>
<FilterGroup bool="AND" not="0" name="APPS_P_DM" sid="S-1-5-21-197296-17673-12288-2972" userContext="1" primaryGroup="0" localGroup="0"></FilterGroup></Filters></Drive>
<Drive clsid="{935D1B74-9CB8-4e3c-9914-7559B7A47}" name="R:" status="R:" image="1" changed="2011-01-06 19:39:29" uid="{172D8-A779-44D1-BBF1-1C121831AE}" bypassErrors="1" policyApplied="1">
<Properties action="R" thisDrive="NOCHANGE" allDrives="NOCHANGE" userName="" path="\\teams" label="Teams" persistent="1" useLetter="1" letter="R"></Properties>
<Filters>
<FilterGroup bool="AND" not="0" name="Teams_R_DM" sid="S-1-5-21-19736-17678563-70918-20873" userContext="1" primaryGroup="0" localGroup="0"></FilterGroup></Filters></Drive>
<Drive clsid="{935D1B74-9CB8-4e3c-9914-7D559B7A7}" name="S:" status="S:" image="1" changed="2011-01-06 19:38:22" uid="{5024EDF8-E1DD-4F15-B4C1-5784C2359D87}" bypassErrors="1" policyApplied="1">
<Properties action="R" thisDrive="NOCHANGE" allDrives="NOCHANGE" userName="" path="\\TempSpace" label="TempSpace" persistent="1" useLetter="1" letter="S"></Properties>
<Filters>
<FilterGroup bool="AND" not="0" name="TempSpace_S_DM" sid="S-1-5-21-19796-1767563-70988-21162" userContext="1" primaryGroup="0" localGroup="0"></FilterGroup></Filters></Drive>
<Drive clsid="{935D1B74-9CB8-4e3c-9914-7D559B7A7}" name="U:" status="U:" image="1" bypassErrors="1" changed="2011-01-06 19:34:51" uid="{585CF6-A251-43C0-ACAE-E314B61E}" policyApplied="1">
<Properties action="R" thisDrive="NOCHANGE" allDrives="NOCHANGE" userName="" path="\\users\%username%" label="%username%&apos;s User Drive" persistent="1" useLetter="1" letter="U"></Properties>
<Filters>
<FilterGroup bool="AND" not="0" name="Users_U_DM" sid="S-1-5-21-1971354296-17679563-7091288-21096" userContext="1" primaryGroup="0" localGroup="0"></FilterGroup></Filters></Drive>
<Drive clsid="{935D1B74-9CB8-4e3c-9914-7D55A417}" name="U:" status="U:" image="1" userContext="1" bypassErrors="1" changed="2011-04-25 18:22:15" uid="{D01FAA-7D95-463D-9AC5-5CC3B9D773}" policyApplied="0">
<Properties action="R" thisDrive="NOCHANGE" allDrives="NOCHANGE" userName="" path="\\U-BP\%username%" label="" persistent="1" useLetter="1" letter="U"></Properties>
<Filters>
<FilterGroup bool="AND" not="0" name="U-BP_U_DM" sid="S-1-5-21-195296-176763-7091228-21645" userContext="1" primaryGroup="0" localGroup="0"></FilterGroup></Filters></Drive></Drives>

I am trying to find both values of "name" for each Drive and "path" - where available

Here's the closest I got

$nodes_array = _XMLSelectNodes("//Drives/*")

for $x =1 to UBound($nodes_array)-1
ConsoleWrite($nodes_array[$x] & @CRLF)

ConsoleWrite(_GetFirstValue('//Drives/Drive[name') & @CRLF)
Next

Func _GetFirstValue($node)
    $ret_val = _XMLGetValue($node)
    If IsArray($ret_val) Then
        Return ($ret_val[1])
    Else
        Return SetError(1,3,0)
    EndIf
EndFunc

many thanks in advance

Share this post


Link to post
Share on other sites
guinness

And my Example too >>

#include <Array.au3>

Global $aReturn, $sXMLData

$sXMLData = "<data>This is a Simple example of XML</data><data>This is a Simple example of XML and is the Second String.</data>"
$aReturn = _GetXML($sXMLData, "data")
Switch @extended
    Case 1
        MsgBox(64, "_GetXML()", _GetXML($aReturn, "data"))

    Case Else
        _ArrayDisplay($aReturn, "_GetXML()")

EndSwitch


Func _GetXML($sString, $sData)
    Local $aReturn, $iUbound
    $aReturn = StringRegExp($sString, '(?s)(?i)<' & $sData & '>(.*?)</' & $sData & '>', 3)
    If @error Then
        Return SetError(1, 0, $sString)
    EndIf
    $iUbound = UBound($aReturn, 1)
    If $iUbound = 1 Then
        Return SetError(0, $iUbound, StringStripWS($aReturn[0], 3))
    EndIf
    Return SetError(0, $iUbound, $aReturn)
EndFunc   ;==>_GetXML

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Share this post


Link to post
Share on other sites
PsaltyDS

Those are attributes not values you are looking for, and this is a better way to walk through the Drive elements:

#include <_XMLDOMWrapper.au3>

_XMLFileOpen(@ScriptDir & "\Test1.xml")
$iDriveCnt = _XMLGetNodeCount("/Drives/Drive")
For $n = 1 To $iDriveCnt
    $sName = _XMLGetAttrib("/Drives/Drive[" & $n & "]", "name")
    ConsoleWrite($n & ":  $sName = " & $sName & @LF)
    $sPath = _XMLGetAttrib("/Drives/Drive[" & $n & "]/Properties", "path")
    ConsoleWrite($n & ":  $sPath = " & $sPath & @LF & @LF)
Next

:)


Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law

Share this post


Link to post
Share on other sites
gcue

And my Example too >>

#include <Array.au3>

Global $aReturn, $sXMLData

$sXMLData = "<data>This is a Simple example of XML</data><data>This is a Simple example of XML and is the Second String.</data>"
$aReturn = _GetXML($sXMLData, "data")
Switch @extended
    Case 1
        MsgBox(64, "_GetXML()", _GetXML($aReturn, "data"))

    Case Else
        _ArrayDisplay($aReturn, "_GetXML()")

EndSwitch

Func _GetXML($sString, $sData)
    Local $aReturn, $iUbound
    $aReturn = StringRegExp($sString, '(?s)(?i)<' & $sData & '>(.*?)</' & $sData & '>', 3)
    If @error Then
        Return SetError(1, 0, $sString)
    EndIf
    $iUbound = UBound($aReturn, 1)
    If $iUbound = 1 Then
        Return SetError(0, $iUbound, StringStripWS($aReturn[0], 3))
    EndIf
    Return SetError(0, $iUbound, $aReturn)
EndFunc   ;==>_GetXML

thanks zedna/guiness =)

i tried this method but it was very messy (had to do alot of string manipulation to getting the results i needed and im still like 3/4 of the way there with string manipulation).

Edited by gcue

Share this post


Link to post
Share on other sites
gcue

Those are attributes not values you are looking for, and this is a better way to walk through the Drive elements:

#include <_XMLDOMWrapper.au3>

_XMLFileOpen(@ScriptDir & "\Test1.xml")
$iDriveCnt = _XMLGetNodeCount("/Drives/Drive")
For $n = 1 To $iDriveCnt
    $sName = _XMLGetAttrib("/Drives/Drive[" & $n & "]", "name")
    ConsoleWrite($n & ":  $sName = " & $sName & @LF)
    $sPath = _XMLGetAttrib("/Drives/Drive[" & $n & "]/Properties", "path")
    ConsoleWrite($n & ":  $sPath = " & $sPath & @LF & @LF)
Next

:)

works great! many thanks psalty!

i am still trying to the get corresponding "name" from the "filtergroup" section.. I tried these but get a -1 error value

$sGroup = _XMLGetAttrib("/Drives/Filters/FilterGroup[" & $n & "]", "name")
ConsoleWrite($n & ":  $sGroup = " & $sGroup & @LF & @LF)

$sGroup = _XMLGetAttrib("/Drives/FilterGroup[" & $n & "]", "name")
ConsoleWrite($n & ":  $sGroup = " & $sGroup & @LF & @LF)

so close!

thanks again!

Share this post


Link to post
Share on other sites
gcue

i got it!

$sGroup = _XMLGetAttrib("/Drives/Drive[" & $n & "]/Filters/FilterGroup", "name")
ConsoleWrite($n & ":  $sGroup = " & $sGroup & @LF & @LF)

thanks again for all your help!!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×