2017-11-29 2 views
-2

Ich habe diese XML-Datei:Wie werden zwei spezifische Elementwerte in einer XML-Datei in einem bestimmten Elementblock ersetzt?

<?xml version = "1.0" encoding = "UTF-8"?> 
<ApplicationsToCheck xmlns = "http://www.tibco.com/schemas/StoreAppraisalSvc/SharedResources/Schemas/HealthCheck/Schema.xsd" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.tibco.com/schemas/StoreAppraisalSvc/SharedResources/Schemas/HealthCheck/Schema.xsd ../Schemas/HealthCheck/HealthCheckSchema.xsd"> 
<Application> 
<ApplicationName>AccountsPayableAdapter</ApplicationName> 
<HAMode>NA</HAMode> 
<AppPortList> 
<HostPort> 
<HostName>ESBBWSVCP01</HostName> 
<Port>57611</Port> 
</HostPort> 
</AppPortList> 
</Application> 
<Application> 
<ApplicationName>CorpCredit</ApplicationName> 
<HAMode>LB</HAMode> 
<AppPortList> 
<HostPort> 
<HostName>ESBBWSVCP01</HostName> 
<Port>57250</Port> 
</HostPort> 
<HostPort> 
<HostName>ESBBWSVCP02</HostName> 
<Port>57250</Port> 
</HostPort> 
</AppPortList> 
</Application> 
<Application> 
<ApplicationName>CustomerSvcV1_0</ApplicationName> 
<HAMode>LB</HAMode> 
<AppPortList> 
<HostPort> 
<HostName>ESBBWSVCP01</HostName> 
<Port>57632</Port> 
</HostPort> 
<HostPort> 
<HostName>ESBBWSVCP01</HostName> 
<Port>57641</Port> 
</HostPort> 
<HostPort> 
<HostName>ESBBWSVCP02</HostName> 
<Port>57632</Port> 
</HostPort> 
<HostPort> 
<HostName>ESBBWSVCP02</HostName> 
<Port>57641</Port> 
</HostPort> 
</AppPortList> 
</Application> 
</ApplicationsToCheck> 

Ich mag die Werte von zwei Host-Namen mit einem Windows-Skript Elemente ändern, schließlich ESBBWSVCP03 statt ESBBWSVCP01 und ESBBWSVCP04 statt ESBBWSVCP02 in der Datei Wert hat, aber nur innerhalb Element ApplicationName mit Wert CorpCredit.

EDIT: Hier ist, was ich versucht habe:

@echo off 
setlocal enabledelayedexpansion 
set sourcefile=d:\CorpApplicationsToCheck.xml 
set tempfile=d:\tempfile.txt 
set oldtoken=ESBBWSVCP01 
set newtoken=ESBBWSVCP03 
type nul>%tempfile% for /f "tokens=*" %%l in (%sourcefile%) do (
    set line=%%l 
    set line=!line:%oldtoken%=%newtoken%! 
    echo !line!>>tempfile.txt 
) 
del %sourcefile% 
move %tempfile% %sourcefile% 

Jede Hilfe wäre sehr willkommen.

Antwort

0

Der Windows-Befehlsinterpreter, der Stapeldateien ausführt, ist nicht für die Verarbeitung von XML-Dateien ausgelegt. Es gibt Skript-Interpreter mit integrierten Funktionen zum Bearbeiten/Ändern von XML-Dateien.

By the way: Die ersten beiden Zeilen der XML-Datei sein sollte:

zwischen Attributnamen, ein Gleichheitszeichen und Attributwert
<?xml version="1.0" encoding="UTF-8"?> 
<ApplicationsToCheck xmlns="http://www.tibco.com/schemas/StoreAppraisalSvc/SharedResources/Schemas/HealthCheck/Schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tibco.com/schemas/StoreAppraisalSvc/SharedResources/Schemas/HealthCheck/Schema.xsd ../Schemas/HealthCheck/HealthCheckSchema.xsd"> 

sollte es sein, kein Platz.

Allerdings kann diese Aufgabe leicht mit JREPL.BAT von Dave Benham geschrieben erfolgen, die eine Batch-Datei/JScript-Hybrid ist für Strings in Dateien Ersetzen eines Perl reguläre Ausdrücke verwenden. Die Datei D:\CorpApplicationsToCheck.xml kann mit der folgenden Stapeldatei aktualisiert werden, wobei sich jrepl.bat im selben Verzeichnis wie diese Stapeldatei befindet.

@echo off 
call "%~dp0jrepl.bat" "(<ApplicationName>CorpCredit</ApplicationName>(?:[\s\S](?!<HostName>))+?[\s\S]<HostName>ESBBWSVCP0)1(</HostName>(?:[\s\S](?!<HostName>))+?[\s\S]<HostName>ESBBWSVCP0)2" "$13$24" /M /F D:\CorpApplicationsToCheck.xml /O - 
rem JREPL.BAT v7.9 leaves behind JREPL\XBYTES.HEX in folder for temporary files. 
rd /Q /S "%TEMP%\JREPL" 2>nul 

Die Erklärung für den regulären Ausdruck Suchbegriff:

( ... ) ... Markierung/Erfassungsgruppe. Die Zeichenfolge, die durch den Ausdruck zwischen dem ersten Klammerpaar gefunden wird, wird in der Ersetzungszeichenfolge mit $1 zurückverlinkt, um diesen Teil der gefundenen Zeichenfolge in Datei ohne eine Änderung zu behalten. Die Suchzeichenfolge enthält ein zweites Klammerpaar zum Erfassen eines zweiten Teils der gefundenen Zeichenfolge, die bei der Ersetzung unmodifiziert bleibt, die mit $2 in der Ersetzungszeichenfolge referenziert wird.

<ApplicationName>CorpCredit</ApplicationName> ... die Groß-/Kleinschreibung dieser Zeichenfolge wie in der Batch-Datei beschrieben.

(?:[\s\S](?!<HostName>))+?[\s\S] ... finden keine Leerzeichen bzw. alle nicht Leerzeichen, die jedes Zeichen einschließlich Zeilenumbrüche 1 oder mehrmals nicht gierige bis zum <HostName> des Startens tag nächsten Auftreten bedeutet. (?: ... ) definiert eine nicht markierende Gruppe, die hier verwendet wird, um einen Ausdruck anzugeben, auf den der Multiplikator + nicht gierig angewendet werden soll, wie mit ? nach dem Multiplikator definiert. ... ) ist ein negativer Lookahead.Dieser Ausdruck dient dazu, alles nach der festgelegten Zeichenkette abzustimmen, die vorher bis neben und nicht irgendeine Anfangskennung <HostName> eingegeben wurde.

<HostName>ESBBWSVCP0 ... diese Zeichenfolge sollte als nächstes wie hier beschrieben gefunden werden.

1 .. Das nächste Zeichen muss dieses Zeichen sein, das außerhalb der Markierungsgruppe liegt, da das Ziel darin besteht, es durch 3 zu ersetzen.

Dann folgt die zweite Markierungsgruppe mit nahezu gleichem Ausdruck mit 2 außerhalb der Markierungsgruppe, die durch 4 ersetzt werden soll.

So ist der Ausdruck sucht nach dem Block:

<ApplicationName>CorpCredit</ApplicationName> 
<HAMode>LB</HAMode> 
<AppPortList> 
<HostPort> 
<HostName>ESBBWSVCP01</HostName> 
<Port>57250</Port> 
</HostPort> 
<HostPort> 
<HostName>ESBBWSVCP02 

Wenn diese mehrzeiligen Zeichenfolge (Block) gefunden werden konnte jrepl.bat mit Option /M (multi-line) verwendet wird, wird es durch den Block ersetzt:

<ApplicationName>CorpCredit</ApplicationName> 
<HAMode>LB</HAMode> 
<AppPortList> 
<HostPort> 
<HostName>ESBBWSVCP03</HostName> 
<Port>57250</Port> 
</HostPort> 
<HostPort> 
<HostName>ESBBWSVCP04 

Alle anderen <HostName>ESBBWSVCP01</HostName> und <HostName>ESBBWSVCP02</HostName> in der Datei werden durch diese Suche und ersetzen ignoriert.

Verwandte Themen