ak-david
Goto Top

Eine xml Datei per Script anpassen

Hallo zusammen

Ich müsste mal wieder einige Dateien anpassen, doch leider keine Ahnung wie, ohne gleich die ganze Datei zu ersetzen, wobei die restlichen Settings je User verloren gehen würden.

Daher die Idee, das mit nem Script zu lösen, das mir einfach alle xml's sucht und diese entsprechend anpasst.

Die Ordnerstruktur sähe wie folgt aus:

Ordner a
Ordner b
Ordner c
Ordner ..

die Weiteren Unterordner sind statisch, bzw. in einigen gibts es keine passende Datei/Unterordner. Statischer teil ..\Avaya\Avaya one-X Communicator\config.xml

also z.B. so: D:\Ordner a\Avaya\Avaya one-X Communicator\config.xm


Die Zeilen in den xml-Dateien varieren. Für mich wichtig ist, dass hier gemäss Beispiel-xml der "value" von "nameUserEnableWebDialIE" auf 0 gesetzt wird (aktueller Wert ist in der Regel 1) siehe Zeile 177).


<?xml version="1.0"?>  
<ConfigData>
<version>1</version>
<parameter>
<name>CurrentSkin</name>
<value>1</value>
</parameter>
<parameter>
<name>UserPreferredLanguage</name>
<value>English</value>
</parameter>
<parameter>
<name>LanguageInUse</name>
<value>English</value>
</parameter>
<parameter>
<name>OwnIPAddress</name>
<value>127.0.0.1</value>
</parameter>
<parameter>
<name>ReUseIPAddress</name>
<value>127.0.0.1</value>
</parameter>
<parameter>
<name>Layer2PriorityForAudio</name>
<value>-1</value>
</parameter>
<parameter>
<name>SipProxyServerList</name>
<value>127.0.0.1</value>
</parameter>
<parameter>
<name>DialPlanCountryCode</name>
<value>41</value>
</parameter>
<parameter>
<name>DialPlanInternationalAccessCode</name>
<value>00</value>
</parameter>
<parameter>
<name>DialPlanLongDistanceAccessCode</name>
<value></value>
</parameter>
<parameter>
<name>DialPlanOutsideLineAccessCode</name>
<value>0</value>
</parameter>
<parameter>
<name>RtpPortLow</name>
<value>2048</value>
</parameter>
<parameter>
<name>RtpPortRange</name>
<value>1281</value>
</parameter>
<parameter>
<name>SipUserAccount</name>
<value>322</value>
</parameter>
<parameter>
<name>SipUserId</name>
<value>322</value>
</parameter>
<parameter>
<name>SipUserPassword</name>
<value></value>
</parameter>
<parameter>
<name>PrevSipUserAccount</name>
<value>322</value>
</parameter>
<parameter>
<name>SignalProtocol</name>
<value>1</value>
</parameter>
<parameter>
<name>UserEnableVideo</name>
<value>0</value>
</parameter>
<parameter>
<name>AudioDeviceList</name>
<value><AudioDeviceList>
<RingViaSecondDevice>true</RingViaSecondDevice>
<RingingDeviceEnabled>false</RingingDeviceEnabled>
<playback>
<device>
<guid>{0.0.0.00000000}.{046e54cb-01f5-45b7-83d9-d29115765493}</guid>
<name>Lautsprecher (Realtek High Definition Audio)</name>
<volume>50</volume>
<state>true</state>
<available>true</available>
</device>
<device>
<guid>{0.0.0.00000000}.{28a667b6-c080-4f5c-9442-c166aed12c9d}</guid>
<name>Lautsprecher (High Definition Audio-Gerät)</name>
<volume>50</volume>
<state>false</state>
<available>false</available>
</device>
</playback>
<microphone>
<device>
<guid>{0.0.1.00000000}.{327e7f46-255b-42fc-9c4e-60d0b98d6e84}</guid>
<name>Mikrofon (Realtek High Definition Audio)</name>
<volume>50</volume>
<state>true</state>
<available>true</available>
</device>
<device>
<guid>{0.0.1.00000000}.{4eeee7ea-f4ba-4ade-b4f3-fe26f3b3d3aa}</guid>
<name>Mikrofon (High Definition Audio-Gerät)</name>
<volume>50</volume>
<state>false</state>
<available>false</available>
</device>
</microphone>
<ringer>
<device>
<guid>{0.0.0.00000000}.{28a667b6-c080-4f5c-9442-c166aed12c9d}</guid>
<name>Lautsprecher (High Definition Audio-Gerät)</name>
<volume>50</volume>
<state>false</state>
<available>false</available>
</device>
<device>
<guid>{0.0.0.00000000}.{046e54cb-01f5-45b7-83d9-d29115765493}</guid>
<name>Lautsprecher (Realtek High Definition Audio)</name>
<volume>50</volume>
<state>true</state>
<available>true</available>
</device>
</ringer>
</AudioDeviceList>
</value>
</parameter>
<parameter>
<name>LoginMode</name>
<value>2</value>
</parameter>
<parameter>
<name>DialPlanAreaCode</name>
<value>032</value>
</parameter>
<parameter>
<name>DialPlanLocalCallPrefix</name>
<value>032</value>
</parameter>
<parameter>
<name>DialPlanExtensionLengthList</name>
<value>3</value>
</parameter>
<parameter>
<name>DialPlanPBXPrefix</name>
<value>6862</value>
</parameter>
<parameter>
<name>MaxC2DDialableLength</name>
<value>12</value>
</parameter>
<parameter>
<name>BlockEmergencyCall</name>
<value>1</value>
</parameter>
<parameter>
<name>AlternateGKAddressList</name>
<value>127.0.0.1</value>
</parameter>
<parameter>
<name>VideoRtpPortLow</name>
<value>2688</value>
</parameter>
<parameter>
<name>VideoRtpPortRange</name>
<value>640</value>
</parameter>
<parameter>
<name>UserEnableWebDialIE</name>
<value>0</value>
</parameter>
<parameter>
<name>UserEnableWebDialFirefox</name>
<value>0</value>
</parameter>
<parameter>
<name>MicrosoftOutlookContacts</name>
<value>1</value>
</parameter>
<parameter>
<name>AvayaSearchDirectory</name>
<value>1</value>
</parameter>
</ConfigData>

Content-Key: 211613

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

Printed on: April 19, 2024 at 22:04 o'clock

Member: Endoro
Endoro Jul 16, 2013 at 12:27:18 (UTC)
Goto Top
Hallo,

dieses Skript brauchst du nur an deine Ordnerstruktur anzupassen.
@echo OFF &SETLOCAL
SET "value=<value>0</value>"  
SET "fxml=file.xml"  
SET "fnew=file.new"  

FOR /f "delims=:" %%a  IN ('findstr /n "UserEnableWebDialIE" "%fxml%"') DO SET "sline=%%a"  
SETLOCAL ENABLEDELAYEDEXPANSION
< "%fxml%" (  
FOR /l %%a IN (1,1,%sline%) DO (
SET "line="  
SET /p "line="  
ECHO(!line!
)
ECHO(!value!)>"%fnew%"  
ENDLOCAL
SET /a sline+=1
<"%fxml%" MORE +%sline% >>"%fnew%"  
TYPE "%fnew%"  

lg
Member: colinardo
colinardo Jul 16, 2013 updated at 14:15:50 (UTC)
Goto Top
Hallo AK-David,
wenn's VBScript sein darf:
(Zeile 1 noch den Ordner angeben in dem jeweiligen Ordner liegen)
ROOTFOLDER = "D:\DeinOrdner in den die Ordner liegen"  
Set fso = WScript.CreateObject("Scripting.Filesystemobject")  
Set fldrROOT = fso.GetFolder(ROOTFOLDER)
parseFolders fldrROOT,True

Function parseFolders(objFolder,boolRecursion)
	For Each file In objFolder.Files
		If LCase(file.Name) = "config.xml" Then  
			changeXMLParameter(file.Path)
		End If
	Next
	
	If boolRecursion Then
		For Each subFolder in objFolder.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function

Function changeXMLParameter(fileName)
	Set xmlDoc = WScript.CreateObject("Msxml2.DOMDocument")  
	xmlDoc.load fileName
	'search single XML-Node via XPath Expression  
	Set node = xmlDoc.selectSingleNode("/ConfigData/parameter[name='UserEnableWebDialIE']/value")  
	If Not node Is Nothing Then
		node.text = 0
                xmlDoc.save(fileName)
	End If
	Set xmlDoc = Nothing
End Function
Grüße Uwe
gelöste Beitrage bitte auch als solche markieren.Danke
Member: AK-David
AK-David Jul 16, 2013 at 13:11:18 (UTC)
Goto Top
Danke Endoro und colinardo für die schnellen Antworten

Das erste Skript von Endoro kriege ich nicht zum laufen.Er findet die gesuchte Datei nicht. Muss wohl noch erwähnen, Programmier-technisch, Batch-mässig bin ich nach wie vor Noob und verstehe nicht wirklich alles. Weiss auch nicht genau, wo da der Pfad rein soll, wobei das ja wieder Ordernabhängig ist, bzw. habe ja x Ordner mit der Selben Unter-Ordner-Struktur

Die zweite Variante von Colinardo läuft soweit sehr gut. musste die 1 von Zeile 26 auf einen 0 ändern, das ist der Wert, den ich am Ende in der xml haben möchte.

Habe bei meinem Test nun festgestellt, dass bei einigen xml's der Name UserEnableWebDialIE inkl. Value gar nicht vorhanden ist. Dieser müsste nun entsprechend gesetzt werden. Ist das auch möglich?
Member: colinardo
colinardo Jul 16, 2013 updated at 15:13:50 (UTC)
Goto Top
Zitat von @AK-David:
Habe bei meinem Test nun festgestellt, dass bei einigen xml's der Name UserEnableWebDialIE inkl. Value gar nicht vorhanden
ist. Dieser müsste nun entsprechend gesetzt werden. Ist das auch möglich?
Kein Problem ...
ROOTFOLDER = "D:\DeinOrdner in den die Ordner liegen"  
Set fso = WScript.CreateObject("Scripting.Filesystemobject")  
Set fldrROOT = fso.GetFolder(ROOTFOLDER)
parseFolders fldrROOT,True

Function parseFolders(objFolder,boolRecursion)
	For Each file In objFolder.Files
		If LCase(file.Name) = "config.xml" Then  
			changeXMLParameter(file.Path)
		End If
	Next
	
	If boolRecursion Then
		For Each subFolder in objFolder.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function

Function changeXMLParameter(fileName)
	Set xmlDoc = WScript.CreateObject("Msxml2.DOMDocument")  
	xmlDoc.load fileName
	'search single XML-Node via XPath Expression  
	Set node = xmlDoc.selectSingleNode("/ConfigData/parameter[name='UserEnableWebDialIE']/value")  
	If Not node Is Nothing Then
		node.text = 0
	Else
		Set parameterNode = xmlDoc.createElement("parameter")  
		Set nameNode = xmlDoc.createElement("name")  
		nameNode.text = "UserEnableWebDialIE"  
		Set valueNode = xmlDoc.createElement("value")  
		valueNode.text = 0
		parameterNode.appendChild(nameNode)
		parameterNode.appendChild(valueNode)
                If xmlDoc.documentElement Is Nothing Then
			Set rootElement = xmlDoc.createElement("ConfigData")  
			xmlDoc.appendChild(rootElement)
		End If
		xmlDoc.documentElement.appendChild(parameterNode)
	End If
	xmlDoc.save(fileName)
	Set xmlDoc = Nothing
End Function

face-wink Uwe
Member: AK-David
AK-David Jul 16, 2013 at 14:57:23 (UTC)
Goto Top
Hi Uwe

Danke für die Ergänzung.

In Zeile 35 erhalte ich die Fehlermeldung "Objekt erforderlich: "xmlDoc.documentElement", Code 800A01A8.

Weisst du da was?
Member: colinardo
colinardo Jul 16, 2013 updated at 15:05:51 (UTC)
Goto Top
fehlt in einer deiner XML-Dateien eventuell das ROOT-Element <ConfigData> ? Überprüfe das mal...
Das kann auch vorkommen wenn ein XML-File nicht standardkonform ist oder ungültige Zeichen enthält.
Member: colinardo
colinardo Jul 16, 2013 at 15:14:53 (UTC)
Goto Top
Habe für den Fall das das ROOT-Element <ConfigData> nicht existiert den Code oben auf diese Situation angepasst...
Member: AK-David
AK-David Jul 16, 2013 at 15:24:55 (UTC)
Goto Top
Ja, genau, war ne leere xml Datei. face-smile

hmm

allerdings wird die neue Zeile komisch eingefügt:

<parameter xmlns=""><value>0</value><name>UserEnableWebDialIE</name></parameter></ConfigData> 

Damit kann das Programm allerding nichts anfangen. müsste ja in etwa so aussehen:

<parameter>
<name>UserEnableWebDialIE</name>
<value>0</value>
</parameter>
</ConfigData>
Member: colinardo
colinardo Jul 16, 2013 at 15:28:38 (UTC)
Goto Top
poste mal den XML Header der Datei, da scheint ein XML-Namespace enthalten zu sein ...
eine normale leere XML-Datei sieht ja so aus:
<?xml version="1.0" encoding="utf-8"?> 
Member: AK-David
AK-David Jul 16, 2013 at 15:43:02 (UTC)
Goto Top
ich hoffe das ist das richtige:

<?xml version="1.0"?> 

danach kommt die 1 Zeile im xml-file (das zugemüse hinten hatte ich im ersten post weggeschnitten):
<ConfigData xmlns="http://xml.avaya.com/endpointAPI"> 
Member: colinardo
colinardo Jul 16, 2013 updated at 16:40:01 (UTC)
Goto Top
danach kommt die 1 Zeile im xml-file (das zugemüse hinten hatte ich im ersten post weggeschnitten):
ist wichtig !! das nächste mal bitte mit posten

Nach deinen zur Verfügung gestellten Angaben, sollte das hier funktionieren:
ROOTFOLDER = "D:\DeinOrdner in den die Ordner liegen"  
Set fso = WScript.CreateObject("Scripting.Filesystemobject")  
Set fldrROOT = fso.GetFolder(ROOTFOLDER)
parseFolders fldrROOT,True
MsgBox "Fertig!"  
Function parseFolders(objFolder,boolRecursion)
	For Each file In objFolder.Files
		If LCase(file.Name) = "config.xml" Then  
			changeXMLParameter(file.Path)
		End If
	Next
	
	If boolRecursion Then
		For Each subFolder in objFolder.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function

Function changeXMLParameter(fileName)
	Set xmlDoc = WScript.CreateObject("Msxml2.DOMDocument.6.0")  
	xmlDoc.load fileName
	'search single XML-Node via XPath Expression  
	Set node = xmlDoc.selectSingleNode("/ConfigData/parameter[name='UserEnableWebDialIE']/value")  
	If Not node Is Nothing Then
		node.text = 0
	Else
		Set parameterNode = xmlDoc.createNode(1,"parameter","http://xml.avaya.com/endpointAPI")  
		Set nameNode = xmlDoc.createNode(1,"name","http://xml.avaya.com/endpointAPI")  
		nameNode.text = "UserEnableWebDialIE"  
		Set valueNode = xmlDoc.createNode(1,"value","http://xml.avaya.com/endpointAPI")  
		valueNode.text = 0
		parameterNode.appendChild(nameNode)
		parameterNode.appendChild(valueNode)
		If xmlDoc.documentElement Is Nothing Then
			xmlDoc.loadXML("<?xml version=""1.0""?><ConfigData xmlns=""http://xml.avaya.com/endpointAPI""></ConfigData>")  
		End If
		xmlDoc.documentElement.appendChild(parameterNode)
		
		' Stylesheet: XML Dokument formatieren (Zeilenumbrüche hinzufügen)  
		Set xltDoc = CreateObject("Msxml2.DOMDocument.6.0")  
		xltDoc.async = False
		xltDoc.loadXML( _
		  "<?xml version=""1.0"" encoding=""utf-8""?>" & vbNewLine & _  
		  "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" & vbNewLine & _  
		  "	<xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes"" />" & vbNewLine & _  
		  "	<xsl:template match=""node()|@*"">" & vbNewLine & _  
		  "		<xsl:copy>" & vbNewLine & _  
		  "			<xsl:apply-templates select=""node()|@*"" />" & vbNewLine & _  
		  "		</xsl:copy>" & vbNewLine & _  
		  "	</xsl:template>" & vbNewLine & _  
		  "</xsl:stylesheet>")  
		xmlDoc.transformNodeToObject xltDoc, xmlDoc
	End If
	xmlDoc.save(fileName)
	Set xmlDoc = Nothing
End Function
Member: AK-David
AK-David Jul 17, 2013 at 08:34:40 (UTC)
Goto Top
Hallo uwe

Sorry, war mir nicht bewusst, hab aber daraus auf jeden Fall gelernt. Danke.

Ja, das Skript läuft nun einwandfrei durch und das Programm verarbeitet die xml ohne Probleme.

Vielen lieben Dank für deine Geduld und deine Arbeit.

Grüsse

David