2016-05-20 2 views
0

Ich erstellen ein Batch-Skript, um die Telefonnummer eines bestimmten Mitarbeiters aus der XML-Datei zu erhalten. Betrachten Sie zum Beispiel die folgenden Daten.Wie kann ich den bestimmten Tag-Inhalt in XML-Datei erhalten, auch wenn mehrere gleiche Tags mit dem Batch-Skript

<?xml version="1.0"?> 
<Employee_Info xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="employee.xs"> 
    <Employee Employee_Number="105"> 
     <Name>Masashi Okamura</Name> 
     <Department>Design Department</Department> 
     <Telephone>03-1452-4567</Telephone> 
     <Email>[email protected]</Email> 
    </Employee> 
    <Employee Employee_Number="109"> 
     <Name>Aiko Tanaka</Name> 
     <Department>Sales Department</Department> 
     <Telephone>03-6459-98764</Telephone> 
     <Email>[email protected]</Email> 
    </Employee> 
</Employee_Info> 

Hier zwei Mitarbeiter Tags sind da, meine Anforderung ist es, die bestimmte Mitarbeiter Telefonnummer zu bekommen. Das heißt, wenn wir die Telefonnummer einer Angestelltennummer 105 erhalten möchten, sollte sie 03-1452-4567 nur wie für 109 auch anzeigen. Bitte helfen Sie mir dabei.

mein Skript ist unten, aber ich bekomme beide Zahlen, könnte mir jeder Körper dabei helfen.

@ECHO Off 
setlocal EnableDelayedExpansion  
FOR /f "tokens=2 delims==>" %%a IN ('find /I "Employee_Number" employee.xml') DO( 
set num=%%~nxa 
IF /I "!num!" EQU "105" ( 
FOR /f "tokens=3 delims=<>" %%b IN ('find /I "telephone" employee.xml') DO echo %%b) 
) 
echo %ph% 

Antwort

0

Ihr Code fehlschlagen, weil der zweite FOR Befehl show alle Telefonnummern. Sie sollten die Anzahl der Datensätze übereinstimmen, dass erste FOR verarbeitet, bis die gewünschte Employee_Number gefunden wurde, und dann die gleiche Anzahl von Datensätzen verwenden, um die Telefonnummer in der zweiten FOR zu zeigen:

@ECHO Off 
setlocal EnableDelayedExpansion  

set "times1=0" 
FOR /f "tokens=2 delims==>" %%a IN ('find /I "Employee_Number" employee.xml') DO (
    set /A times1+=1 
    set "num=%%~a" 
    IF /I "!num!" EQU "105" ( 
     set "times2=0" 
     FOR /f "tokens=3 delims=<>" %%b IN ('find /I "telephone" employee.xml') DO (
     set /A times2+=1 
     IF !times2! equ !times1! set "ph=%%b" 
    ) 
    ) 
) 
echo %ph% 
+0

vielen Dank @ Aacini. Danke für deine Hilfe, es funktioniert gut und mein Problem ist jetzt gelöst – IamKishore

0

Angenommen, die Anzahl der Employee und Telephone Tags ist identisch. Mein allgemeiner Ansatz würde die Verwendung der SKIP-Option innerhalb des FOR-Befehls beinhalten.

FINDEN Sie alle Employee-Tags, dann führen Sie eine FOR-Schleife durch, damit sie die mit Ihrer gewünschten Nummer finden. Nach jedem, das du nicht gesucht hast, erhöhe eine Variable, um zu zählen, wie viele du bestanden hast, bis du die richtige gefunden hast.

Jetzt finden Sie alle Telefon-Tags, FOR Schleife sie, aber überspringe die Nummer, die Sie in der Schleife vor. In Ihrem Beispiel wäre, dass die Nummer 2 sein:

FOR /f "skip=2 tokens=3 delims=<>" %%b IN ('find /I "telephone" employee.xml') DO echo %%b) 
0

dies benötigt ein Argument - die Datei, die Sie Informationen aus erhalten möchten:

@if (@X)==(@Y) @end /* JScript comment 
    @echo off 
    cscript //E:JScript //nologo "%~f0" %* 
    exit /b %errorlevel% 

@if (@X)==(@Y) @end JScript comment */ 

var objDoc = WScript.CreateObject("MSXML.DOMDocument"); 
objDoc.load(WScript.Arguments.Item(0)); 

var nodesList = objDoc.selectNodes("//Employee/Telephone"); 
var nodesList2 = objDoc.selectNodes("//Employee"); 
for(var i=0;i<nodesList.length;i++){ 
    WScript.Echo(nodesList2.item(i).getAttribute("Employee_Number")+":"+nodesList.item(i).text); 
}