chris27584
Goto Top

Inhalt einer XML Datei Script ändern

Hallo zusammen,

in folgendem Script

<?xml version="1.0"?>
-<SkClientConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LastServerIndex>1</LastServerIndex>
<LastUser>11111</LastUser>
<LastWorkplace>2358</LastWorkplace>
-<SerializableFont>
<FontValue>Microsoft Sans Serif; 8,25pt</FontValue>
</SerializableFont>
<LoginMode>Manual</LoginMode>
-<Servers>
<string>192.168.101.111:520;192.168.101.120</string>
<string>192.168.101.115:520;192.168.101.119</string>
</Servers>
<CtiSocketPort>0</CtiSocketPort>
<LOGPath>LOG</LOGPath>
<Language>de</Language>
<LogoutColor>White</LogoutColor>
<MulticastGroup/>
<MulticastPort>0</MulticastPort>
<ReflectorAdr/>
<ReflectorPort>0</ReflectorPort>
<CallDiversionLoginPause>-1</CallDiversionLoginPause>
<CallDiversionWait>0</CallDiversionWait>
<Hint/>
<AllowLoginWithoutWorkplace>true</AllowLoginWithoutWorkplace>
<CloseWait>0</CloseWait>
<CloseText/>
<LocalHttpServerPort>4444</LocalHttpServerPort>
<Title/>
</SkClientConfig>

sollen beide <String>-Werte geändert werden.

Eine Anleitung zum Ändern eines Wertes habe ich bereits gefunden,

Const ForReading = 1
Const AsASCII = 0


strFixedValue1 = "10.100.82.3:520;10.100.82.5"
strFixedValue2 = "10.100.82.9:520;10.100.82.11"

If WScript.Arguments.Count > 0 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")

strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0))
If WScript.Arguments.Count > 1 Then strFixedValue = WScript.Arguments(1)

If objFSO.FolderExists(strSrcDir) Then
Set objRegExp = New RegExp
objRegExp.Global = False
objRegExp.IgnoreCase = True

For Each objFile In objFSO.GetFolder(strSrcDir).Files
If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then
'Eingabedatei lesen
Set objInFile = objFile.OpenAsTextStream(ForReading, AsASCII)
strContent = objInFile.ReadAll
objInFile.Close


'Den Wert zwischen <servers></servers>
'durch einen fixen Wert ersetzen

objRegExp.Pattern = "(<string>).*(</string>)"
strContent = objRegExp.Replace(strContent, "$1" & strFixedValue1 & "$2")
objRegExp.Pattern = "(<string>).*(</string>)"
strContent = objRegExp.Replace(strContent, "$1" & strFixedValue2 & "$2")

'Ausgabedaei schreiben
Set objOutFile = objFSO.CreateTextFile(objFSO.BuildPath(strSrcDir, objFSO.GetBaseName(objFile.Name) & "_Neu." & objFSO.GetExtensionName(objFile.Name)), True)
objOutFile.Write strContent
objOutFile.Close
End If
Next
End If
End If

aber wie kann ich beide gleichzeitig ändern?
Denn mein hier enthaltener bereits gedachter Ansatz klappt nicht.

Hat hier jemand einen schnellen Tip?

Vielen Dank im voraus

Chris27584

Content-Key: 348863

Url: https://administrator.de/contentid/348863

Ausgedruckt am: 29.03.2024 um 09:03 Uhr

Mitglied: MrCount
MrCount 12.09.2017 um 14:10:12 Uhr
Goto Top
Servus,

also die einfachste/schnellste Methode wird vermutlich sein, die beiden Zeilen zu löschen und neu einzufügen. face-wink
Mitglied: em-pie
em-pie 12.09.2017 um 14:58:47 Uhr
Goto Top
Moin,

bei einer Datei gebe ich MrCount recht.
Ansonsten kann vbs anscheinend gut mit XML arbeiten, da MS ein Objekt/ eine Klasse bereitstellt.
Schaue hier mal unter Punkt 4, scheint eine sehr simple Thematik zu sein (habe es selbst noch nicht getestet/ verwenden müssen):
https://technet.microsoft.com/de-de/library/2008.02.heyscriptingguy.aspx ...

Gruß
em-pie
Mitglied: 133883
Lösung 133883 12.09.2017 aktualisiert um 22:15:29 Uhr
Goto Top
Moin,
wie @em-pie schon schreibt ist die oberste Regel bei XML Dateien diese nur über einen Parser regelkonform zu verändern und nicht mit String-Replace zu arbeiten.
Also nutze die dafür vorgesehenen Objekte:
set xml = CreateObject("MSXML2.Domdocument.6.0")  
xml.Load "D:\demo.xml"  
set nodes = xml.SelectNodes("/SkClientConfig/Servers/string")  
nodes(0).text = "erster Wert"  
nodes(1).text = "zweiter Wert"  
xml.Save "D:\demo.xml"  
Gruß @133883
Mitglied: chris27584
chris27584 14.09.2017 um 13:19:46 Uhr
Goto Top
Moin,

Zuerst mal vielen Dank an alle für die fixen Antworten.

Habe mich für @133883's Lösung entschieden, genau das was ich suchte, auch für kommende Aufgaben ;)


Gruß Chris