Jump to content

Edit a few lines in XML file - use values from popup?


scanie
 Share

Recommended Posts

I'm trying to create a script that can be used for editing an XML file. I want the script to show a popup and ask for which text to insert.

Example:

"Insert the server address and press OK."

And when the server address has been typed in it should insert that and then go to the next line and show a new popup.

These are the three lines I want to edit. Server, to and from.

<Actions Context="Author">
<SendEmail>
     <Server></Server>
     <To></To>
     <From></From>
     <HeaderFields />
</SendEmail>
</Actions>

Can it be done easily? :)

Link to comment
Share on other sites

scanie,

Is there more than one instance of any of these pairs?

Is this the entire XML file?

Why popup menus?

There are many threads dealing with XML files, have you searched the forum for solutions?

kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Link to comment
Share on other sites

StringRegExp would be the way to go or the XML UDF that can be found in the examples. Search _GetXML for an idea of syntax, but your will need to amend to suit your needs.

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

scanie,

Is there more than one instance of any of these pairs?

Is this the entire XML file?

Why popup menus?

There are many threads dealing with XML files, have you searched the forum for solutions?

kylomas

kylomas,

Here is the entire XML file:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2012-03-01T14:31:50.2136</Date>
<Author></Author>
</RegistrationInfo>
<Triggers>
<EventTrigger>
     <Enabled>true</Enabled>
     <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-Backup"&gt;&lt;Select Path="Microsoft-Windows-Backup"&gt;*[System[Provider[@Name='Microsoft-Windows-Backup'] and EventID=4]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
</EventTrigger>
</Triggers>
<Principals>
<Principal id="Author">
     <UserId></UserId>
     <LogonType>Password</LogonType>
     <RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<IdleSettings>
     <Duration>PT10M</Duration>
     <WaitTimeout>PT1H</WaitTimeout>
     <StopOnIdleEnd>true</StopOnIdleEnd>
     <RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<SendEmail>
     <Server></Server>
     <Subject>Daily Backup Report</Subject>
     <To></To>
     <From></From>
     <Body>SCANERGY-VMM Backup Successful!</Body>
     <HeaderFields />
</SendEmail>
</Actions>
</Task>

The file is used by Windows Backup and we are using it at work. I want my colleagues to be able to use this at different customers, and all customers have different smtp-addresses and server names. That's why I thought that a popup would be nice. Run the script, fill out the popups and you're good to go!

I have searched this forum and also Google for how to do it in Autoit or vbscript.. But I never thought it would be this hard.. It seemed easy when I thought about it :)

Edited by scanie
Link to comment
Share on other sites

microsoft.xmldom:

$oXML=ObjCreate("Microsoft.XMLDOM")
$stest = @DesktopDir & "\xml1.xml"
;$oXML.LoadXML('<td class="questionTitle"><a href="testing an attribute.html" class="asdf" >asdf</a></td>') ; load text of the DOM object
$oXML.load($stest) ; load file of xml
;ConsoleWrite ( $oXML.xml & @CRLF)
; change node
$result1 = $oXML.selectSingleNode('//SendEmail/To')
$result1.text = "whatever you want it to be1"
; change attribute
$result2 = $oXML.selectSingleNode('//SendEmail/From')
$result2.text = "whatever you want it to be2"
ConsoleWrite ( $oXML.xml & @CRLF)
exit
IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.
Link to comment
Share on other sites

microsoft.xmldom:

$oXML=ObjCreate("Microsoft.XMLDOM")
$stest = @DesktopDir & "\xml1.xml"
;$oXML.LoadXML('<td class="questionTitle"><a href="testing an attribute.html" class="asdf" >asdf</a></td>') ; load text of the DOM object
$oXML.load($stest) ; load file of xml
;ConsoleWrite ( $oXML.xml & @CRLF)
; change node
$result1 = $oXML.selectSingleNode('//SendEmail/To')
$result1.text = "whatever you want it to be1"
; change attribute
$result2 = $oXML.selectSingleNode('//SendEmail/From')
$result2.text = "whatever you want it to be2"
ConsoleWrite ( $oXML.xml & @CRLF)
exit

Thank you!

It can't get it to prompt me for input though. And it doesn't write anything to my XML file.

It doesn't do anything except loading the XML I believe.

Did you try it on your side? Do I have to do anything special or install something?

Link to comment
Share on other sites

How about this ?

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("", 140, 119, 192, 124)
$Input1 = GUICtrlCreateInput("Server", 8, 8, 121, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
$Input2 = GUICtrlCreateInput("To", 8, 32, 121, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
$Input3 = GUICtrlCreateInput("From", 8, 56, 121, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
$Button1 = GUICtrlCreateButton("Change", 8, 80, 123, 25)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$read_server = GUICtrlRead($Input1)
$read_to = GUICtrlRead($Input2)
$read_from = GUICtrlRead($Input3)

$file = @ScriptDir & "\file.xml" ; This is the XML file you posted, edit the path and name to your XML file path and file name
$new_file = @ScriptDir & "\NewFile.xml" ; This is the new created file with the edited Server, To and From

$file_read = FileRead($file, FileGetSize($file))

$file_read = StringReplace($file_read, " <Server></Server>", " <Server>" & $read_server & "</Server>")
$file_read = StringReplace($file_read, " <To></To>", " <To>" & $read_to & "</To>")
$file_read = StringReplace($file_read, " <From></From>", " <From>" & $read_from & "</From>")
FileDelete($new_file)
FileWrite($new_file, $file_read)

MsgBox(0, "Msg", "Done")
Exit

EndSwitch
WEnd
Edited by HeavenlyDemon
Link to comment
Share on other sites

How about this ?

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("", 140, 119, 192, 124)
$Input1 = GUICtrlCreateInput("Server", 8, 8, 121, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
$Input2 = GUICtrlCreateInput("To", 8, 32, 121, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
$Input3 = GUICtrlCreateInput("From", 8, 56, 121, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
$Button1 = GUICtrlCreateButton("Change", 8, 80, 123, 25)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$read_server = GUICtrlRead($Input1)
$read_to = GUICtrlRead($Input2)
$read_from = GUICtrlRead($Input3)

$file = @ScriptDir & "\file.xml" ; This is the XML file you posted, edit the path and name to your XML file path and file name
$new_file = @ScriptDir & "\NewFile.xml" ; This is the new created file with the edited Server, To and From

$file_read = FileRead($file, FileGetSize($file))

$file_read = StringReplace($file_read, " <Server></Server>", " <Server>" & $read_server & "</Server>")
$file_read = StringReplace($file_read, " <To></To>", " <To>" & $read_to & "</To>")
$file_read = StringReplace($file_read, " <From></From>", " <From>" & $read_from & "</From>")
FileDelete($new_file)
FileWrite($new_file, $file_read)

MsgBox(0, "Msg", "Done")
Exit

EndSwitch
WEnd

This was a nice way to do it!

It creates the new file but it doesn't have the changes in it. I have tried to find the error but I can't..

Link to comment
Share on other sites

works fine for me, but only when i make the XML header valid:

<?xml version="1.0" encoding="UTF-8"?>

Also, I was just showing how to manipulate the XML, use a gui or msgbox to fill in the rest.

To save changes using XML dom, use:

$oXML.save('file and path')

$oXML=ObjCreate("Microsoft.XMLDOM")
$stest = @DesktopDir & "\xml1.xml"
;$oXML.LoadXML('<td class="questionTitle"><a href="testing an attribute.html" class="asdf" >asdf</a></td>') ; load text of the DOM object
$oXML.load($stest) ; load file of xml
;ConsoleWrite ( $oXML.xml & @CRLF)
; change node
$result1 = $oXML.selectSingleNode('//SendEmail/To')
$result1.text = "whatever you want it to be1"
; change attribute
$result2 = $oXML.selectSingleNode('//SendEmail/From')
$result2.text = "whatever you want it to be2"
ConsoleWrite ( $oXML.xml & @CRLF)
$oXML.save($stest)
Edited by jdelaney
IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.
Link to comment
Share on other sites

check the

$file_read = StringReplace($file_read, " <Server></Server>", " <Server>" & $read_server & "</Server>")
$file_read = StringReplace($file_read, " <To></To>", " <To>" & $read_to & "</To>")
$file_read = StringReplace($file_read, " <From></From>", " <From>" & $read_from & "</From>")

what you are saying is that the replace cant find " <Server></Server>" , " <To></To>", " <From></From>" in the xml file

copy the exact line from the xml file in the script

Edited by HeavenlyDemon
Link to comment
Share on other sites

check the

$file_read = StringReplace($file_read, " <Server></Server>", " <Server>" & $read_server & "</Server>")
$file_read = StringReplace($file_read, " <To></To>", " <To>" & $read_to & "</To>")
$file_read = StringReplace($file_read, " <From></From>", " <From>" & $read_from & "</From>")

what you are saying is that the replace cant find " <Server></Server>" , " <To></To>", " <From></From>" in the xml file

copy the exact line from the xml file in the script

From the script that you provided:

$file_read = StringReplace($file_read, " <Server></Server>", " <Server>" & $read_server & "</Server>")
$file_read = StringReplace($file_read, " <To></To>", " <To>" & $read_to & "</To>")
$file_read = StringReplace($file_read, " <From></From>", " <From>" & $read_from & "</From>")
FileDelete($new_file)
FileWrite($new_file, $file_read)

from my XML:

<SendEmail>
<Server></Server>
<Subject>Daily Backup Report</Subject>
<To></To>
<From></From>
<Body></Body>

I got the script from jdelaney to work but I still haven't figured out how to combine it with your GUI :)

Thank you both for your help so far!

Edited by scanie
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...