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

Printed on: April 23, 2024 at 11:04 o'clock

Member: MrCount
MrCount Sep 12, 2017 at 12:10:12 (UTC)
Goto Top
Servus,

also die einfachste/schnellste Methode wird vermutlich sein, die beiden Zeilen zu löschen und neu einzufügen. face-wink
Member: em-pie
em-pie Sep 12, 2017 at 12:58:47 (UTC)
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
Solution 133883 Sep 12, 2017 updated at 20:15:29 (UTC)
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
Member: chris27584
chris27584 Sep 14, 2017 at 11:19:46 (UTC)
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