2016-05-04 96 views
1

如果我有以下格式的xml文件,我該如何在批處理(.bat)腳本中解析它?或者有沒有一種方法,我只能得到一定的價值,而不解析它?蝙蝠文件來解析XML

例如,我需要從這個xml文件中獲取'date'的值。

<?xml version="1.0" encoding="UTF-8"?> 
<note> 
<slideshow 
    title="Sample Slide Show" 
    date="2016/05/03" 
    author="Yours Truly" > 

</slideshow> 
</note> 
+0

純批處理腳本不能解析XML文件;我推薦使用本地支持XML的語言(PowerShell,VBScript,JavaScript等?);如果你確實需要一個批處理文件,你甚至可以嵌入另一種語言;如果你不想要這個,你需要讀取XML文件作爲正常文本... – aschipfl

回答

1

這是純粹的解決方案。以下腳本需要三個命令行參數:XML文件(的路徑),節點(示例中的slideshow)和屬性名稱(date),按給定順序排列。返回數據輸出到控制檯窗口,並可以重定向到一個文件(>)。

這是一個示例命令行運行腳本(假設該XML文件被稱爲presentation.xml,腳本被命名爲extract-xml-attrib.bat並將所得數據是要被寫入到attr.txt):

"extract-xml-attrib.bat" "presentation.xml" "slideshow" "date" > "attr.txt" 

這是腳本代碼extract-xml-attrib.bat

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "XML=%~1" 
set "TAG=%~2" 
set "PAR=%~3" 

rem // Define defaults here: 
if not defined XML set "XML=presentation.xml" 
if not defined TAG set "TAG=slideshow" 
if not defined PAR set "PAR=date" 

set "FLAG=" 
for /F usebackq^ delims^=^ eol^= %%L in ("%XML%") do (
    set "LINE=%%L" 
    setlocal EnableDelayedExpansion 
    set "REST=!LINE:*<%TAG%=!" 
    if not defined REST (
     set "FLAG=#" 
    ) else (
     set "REST=!LINE:*<%TAG% =!" 
     if not "!REST!"=="!LINE!" (
      set "FLAG=#" 
     ) else (
      set "REST=!LINE:*<%TAG% =!" 
      if not "!REST!"=="!LINE!" (
       set "FLAG=#" 
      ) 
     ) 
    ) 
    for /F "tokens=1,2 delims=>" %%E in ("!REST!/") do (
     if defined FLAG (
      endlocal 
      set "FLAG=#" 
     ) else (
      endlocal 
     ) 
     set "REST=%%E" 
     if defined FLAG (
      call :GET_ATTR "REST:~,-1" "%PAR%" 
     ) 
     if not "%%F"=="" (
      set "FLAG=" 
     ) 
     setlocal EnableDelayedExpansion 
    ) 
    endlocal 
) 

endlocal 
exit /B 


:GET_ATTR var_string param_name 
setlocal DisableDelayedExpansion 
set "PAR=%~2" 
setlocal EnableDelayedExpansion 
set "STR=!%~1!" 
set "NEXT=" 
for %%S in (!STR!) do (
    if defined NEXT (
     endlocal 
     echo(%%~S 
     set "NEXT=" 
     setlocal EnableDelayedExpansion 
    ) 
    set "STR=!STR:*%%S=!" 
    if "%%S"=="%PAR%" (
     if defined STR (
      if "!STR:~,1!"=="=" (
       if "!STR:~1,1!"==" " (
        echo(
       ) else if "!STR:~1,1!"==" " (
        echo(
       ) else (
        set "NEXT=#" 
       ) 
      ) 
     ) 
    ) 
) 
if defined NEXT echo(
endlocal 
endlocal 
exit /B 
2

下面是接受一個參數的腳本 - xml文件,並得到幻燈片播放的節點日期屬性值。你可以改變,以適合您的需求,如果該文件具有不同結構的XPath查詢:

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

    rem :: the first argument is the script name as it will be used for proper help message 
    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 objNode = objDoc.selectSingleNode("//slideshow"); 
WScript.Echo(objNode.getAttribute("date")); 

編輯 這裏現在是一個xpath.bat - 爲了共同使用,可以解析xml文件的腳本。

+0

感謝您的答案。它運作良好。我很好奇我是否可以使用'date'的值作爲運行另一個bat腳本的參數? – Taewan

+1

是的,你可以 - [只是用命令調用批處理文件](http://stackoverflow.com/questions/16203629/batch-assign-command-output-to-variable) – npocmaka