2017-01-24 21 views
0

2つの異なるXMLタグの間でテキストを読み取り、その値をテキストファイルに書き込むバッチファイルを作成しようとしています。以下のように...バッチファイルを使用してxmlタグ間でテキストをコピー

<JobInformation> 
<JOB> 
<JobName>17Jan_125thou_DEC_B_FullSheet</JobName> 
<Date>17 Jan 2017 11:24:34</Date> 
<CDI>192.168.0.29</CDI> 
<Circumference unit='mm'>1289.94mm</Circumference> 
<Laser-Energy unit='J/sqcm'>3.2</Laser-Energy> 
<XL-Workflow>XL125_45</XL-Workflow> 
<Knife-Type>45 Degree</Knife-Type> 
<PREVIEW- IMAGE>"./images/17Jan_125thou_DEC_B_FullSheet/17Jan_125thou_DEC_B_FullSheet.jpg< /PREVIEW-IMAGE> 
</JOB> 
<Plate> 
<PlateName>DECx125_20115</PlateName> 
<Type>PLATE</Type> 
<PlateWidth unit='mm'>2032.0</PlateWidth> 
<PlateHeight unit='mm'>1254.94</PlateHeight> 
<TotalSize unit='sqm'>2.55</TotalSize> 
<Waste unit='sqm'>0.285</Waste> 
</Plate> 

XMLは次のようになります。

タグ<PlateName></PlateName><Waste></Waste>の間で情報を抽出したいと思います。

また、バッチプログラミング以外の方法がある場合は、ご案内ください。また、私は特定のフォルダにたくさんのXMLファイルを読み込もうとしていますが、それらはすべて同じタグを持っています。

以下のコードはタグPlateNameなくWasteからデータを読み取ります

@echo OFF 

del output.txt 

for /f "delims=" %%i in ('findstr /i /c:"<PlateName>" *.xml') do call  :job1 "%%i" 
for /f "delims=" %%i in ('findstr /i :"<Waste>" *.xml') do call  :job2 "%%i" 
goto :eof 

:job1 

set line=%1 

set line=%line:/=% 
set line=%line:<=+% 
set line=%line:>=+% 
set line=%line:*+PlateName+=% 
set line=%line:+=&rem.% 
echo.%line%>>output.txt 

:job2 

set line2=%1 

set line2=%line2:/=% 
set line2=%line2:<=+% 
set line2=%line2:>=+% 
set line2=%line2:*+Waste+=% 
set line2=%line2:+=&rem.% 
echo.%line2%>>output.txt 

:eof 

それのように出力が得られます。この中にさらに

DECx125_20115 
"17Jan_125thou_DEC_B_FullSheet.xml:&rem.PlateName&rem.DECx125_20115&rem.PlateName&rem." 

、どのように私は最初の数を読むためにコードを編集することができますタグ間の値の文字?たとえば、313719_V4_DSpotOrange(31 Mar 2017 16:50:17)で私は313719を読みたいだけです。

+2

PowerShellには、強力なXML解析機能が組み込まれています。私はこれを使用することを強くお勧めします。 GoogleのPowerShellには、XMLを解析するための記事がたくさんあります。 –

+1

2番目の 'findstr'コマンドラインにタイプミスがあります:' findstr/i/c: "" ' - '/c'オプションがありません。 ':job2'と上記の行の間に' goto:eof'を挿入してください!あなたのコードは、XMLファイルには現れないリテラル文字列 ''を探しています。 '' ... – aschipfl

+3

@SharvilRavalの部分だけがあります。あなたはコメントにコード更新を入れません。あなたの質問を編集し、コメントを削除してください。 – Squashman

答えて

0

常に同じ方法でフォーマットされていれば、次のようにもっと簡単な方法で行うことができます:

@echo OFF 

del output.txt 

for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<PlateName>" *.xml') do (
echo %%i>>output.txt 
) 
for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<Waste" *.xml') do (
echo %%i>>output.txt 
) 

ただし、@ RBです。適切なXML解析機能を備えたものを使用するほうがはるかに優れていると言います。 Powershellは1つのオプション、VBscriptは別のオプションです。

+0

これは私のために働く感謝!!! –

+3

1行だけ必要です。 "findstr/i/c:" "/ C:" <廃棄 "* .xml ')do echo %% G' – Squashman

+0

これに加えて、タグ間の値の最初の数文字だけを読み取るようにコードを編集するにはどうすればよいですか?たとえば: 313719_V4_DSpotOrange(30 Mar 2017 16:50:17) 私は313719を読んでみたい。ガイドしてください –

2

xmlの末尾にもう1つの</JobInformation>タグが必要です。好き

@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 objNode = objDoc.selectSingleNode("//"+WScript.Arguments.Item(1)); 
WScript.Echo(objNode.text); 

、あなたはそれを使用することができます:

call getXMLText.bat "xml.xml" Waste 
call getXMLText.bat "xml.xml" PlateName 
0

を単一findstrコマンドでの正規表現の使用:

を あなたが実際にxpath.Tryで、このスクリプトを、データを取得するためにXMLを解析することができます
for /F "tokens=2,3 delims=<>" %%a in ('findstr "<PlateName>.*</PlateName> <Waste .*>.*</Waste>" *.txt') do (
    echo Found: %%a : %%b 
) 

出力:

Found: PlateName : DECx125_20115 
Found: Waste unit='sqm' : 0.285 

また、あなたが書いた:また

案内してくださいバッチプログラミング以外の方法があるかどうか。

文字通り、他の方法でこれを行うとよいでしょう。 バッチファイルは、XMLを正確に解析するのに最も悪いです。 C++

C#の のJava、Pythonの、または何か他のものが良いだろう。

関連する問題