2016-05-04 17 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

ここに純粋なソリューションがあります。次のスクリプトでは、3つのコマンドライン引数(XMLファイルへのパス)、ノード(例ではslideshow)、属性名(date)が指定された順序で必要です。戻りデータはコンソールウィンドウに出力され、ファイルにリダイレクトされます(>)。

この

は、(スクリプトが extract-xml-attrib.bat命名され、 presentation.xmlと呼ばれるXMLファイルを想定し、得られたデータは、 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を1つ受け取り、スライドショーのノードの日付属性値を取得するスクリプトを示します。 - XMLファイルを解析することができます一般的な使用のためのスクリプト

@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")); 

EDIT は今ここxpath.batです:あなたは、ファイルが異なる構造を持っている場合は、あなたのニーズに合っするXPathクエリを変更することができます。

+0

答えをありがとう。それはうまくいく。私は別のバットスクリプトを実行するパラメータとして '日付'の値を使用できるかどうかは不思議ですか? – Taewan

+1

はい、できます - [コマンドでのバッチファイルの呼び出し](http://stackoverflow.com/questions/16203629/batch-assign-command-output-to-variable) – npocmaka