Jump to content

XML help


Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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!

Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...