2012-12-16 55 views
0

我是一位初學者,編寫批處理腳本時非常讚賞您的幫助。提取XML標記值(基於標記)使用批處理

下面是XML和我需要提取標誌爲「開」到一個txt文件中的所有名稱。還有其他幾個類別標籤實例。

<Head> 
    <Category 
     name="RIVERTD" 
     flag="on" 
     location="SG002"> 
    </Category> 
    <Category 
     name="BRETRED" 
     flag="on" 
     location="IT213"> 
    </Category> 
    <Category 
     name="AMERAND" 
     flag="off" 
     location="US212"> 
    </Category> 
</Head> 

所以,我在找的輸出如下

RIVERTD 
BRETRED 

我嘗試使用下面的代碼

@echo off 
setlocal disableDelayedExpansion 
set input="CP.xml" 
set output="Names.txt" 

if exist %output% del %output% 
for /f "delims=" %%A in ('findstr /n /c:"name=" %input%') do (
    set "ln=%%A" 
    setlocal enableDelayedExpansion 
    call :parseLine 
    endlocal 
) 
type %output% 
exit /b 

:parseLine 
set "ln2=!ln:*name=!" 
if "!ln2!"=="!ln!" exit /b 
for /f tokens^=2^ delims^=^" %%B in ("!ln2!") do (
    setlocal disableDelayedExpansion 
    >>%output% echo(%%B 
    endlocal 
) 
set "ln=!ln2!" 
goto :parseLine 

這給我結果

RIVERTD 
BRETRED 
AMERAND 

然而此代碼不會過濾基於fla的名稱G。我是初學者。請幫助添加基於標誌的過濾器。非常感謝。

+0

是誰在持有該槍到你的腦袋,讓你試圖用.BAT文件解決這個問題?如果您能以某種方式壓倒他們並重獲自由,那麼請考慮使用更合適的工具(如XSLT或XPath庫)來解決此問題。或者也許我們應該派遣一名人質談判員來解決這個問題?請指教。 –

+0

@ C.M.Sperberg-McQueen:我不理解那些批評批處理文件但不知道其功能的人。我非常肯定,沒有XSLT和XPath解決方案,也沒有任何其他語言/包解決方案,可以比我下面的6行批處理解決方案更簡單... – Aacini

+0

@Aacini,你可能是對的。 (但是爲了比較,在這裏檢索名稱的XPath表達式是'Category [@ flag ='on']/@ name';這不包括像選擇文件那樣的非XPath開銷,所以實際上它不是必須總是一行一行。) –

回答

1

此問題可能是一個非常有趣的技巧來解決!:

@echo off 
setlocal EnableDelayedExpansion 
(for /F "tokens=1,2 delims== " %%a in (CP.xml) do (
    if "%%~b" neq "" set %%a=%%~b 
    if /I "!flag!" equ "on" echo !name!& set flag= 
)) > Names.txt 

編輯幾點說明adeded

的文件有幾行,但OP找具有分配的表格線,像這樣的:

name="RIVERTD" 
    flag="on" 

    name="BRETRED" 
    flag="on" 

    name="AMERAND" 
    flag="off" 

我的程序不檢查任何名稱,但執行任何帶有等號後的值作爲賦值的行。這樣,當我的程序進程之前線,其結果等同於執行以下命令:

set name="RIVERTD" 
    set flag="on" 

    set name="BRETRED" 
    set flag="on" 

    set name="AMERAND" 
    set flag="off" 

之後,只是檢查是否標誌變量有「上」的價值;如果是這樣,那麼NAME變量具有目標值,因爲它是在前一行中分配的。

安東尼

+0

作品完美..... – NoobTechie

+0

如果可能的話你可以給一點小技巧的解釋.. – ajp

+0

@ajp:說明加了,檢查一下 – Aacini

1

這應該爲你做。

@echo off 
setlocal enabledelayedexpansion 

set "Name=" 
set "Flag=" 
set "Output=Names.txt" 

for /f "usebackq delims=" %%L in (`type "CP.xml"`) do (
    for /f "usebackq tokens=1,2* delims= =<> " %%A in ('%%L') do (
     if /i "%%~A"=="name" set "Name=%%~B" 
     if /i "%%~A"=="flag" set "Flag=%%~B" 
     if /i "%%~A"=="/category" (
      if /i "!Flag!"=="on" echo.!Name!>>%Output% 
      set "Name=" 
      set "Flag=" 
     ) 
    ) 
) 

endlocal 
pause 
1

這裏的xpath.bat - 小腳本,讓你獲得通過XPath表達式一個XML值,而無需使用外部二進制文件:這是不是一個答案]

call xpath.bat "CP.xml" "//Category[0]/@name" 
call xpath.bat "CP.xml" "//Category[1]/@name" 
+1

完美!正是我需要的,謝謝。 – nrodic