使用Windows Batch比较多个XML文件标签

时间:2014-09-30 12:33:50

标签: xml windows batch-file cmd

我正在尝试创建一个批处理文件,该文件比较存储在两个不同位置的单个XML文件的两个副本,并检查它们的版本是否相同。

目前我正在使用fc& findstr命令只检查2个文件中的构建标记,但我想添加代码1st检查主要标记的功能,如果不同则代码停止执行并打印“文件不同”。

如果值相同,则继续检查2个文件中的次要标签。如果值不同,则代码停止执行并打印“文件不同”。如果值相同则继续检查构建标记。如果构建值不同,则打印“文件不同”,否则“文件相同”..

因此,检查标签的流程是 - > - >

存储在2个不同位置的文件是

TData.xml

<?xml version="1.0" encoding="UTF-8"?>
<CDMDataXML xmlns="http://www.avocent.org/trellis/CDMLoaderXMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.avocent.org/trellis/CDMLoaderXMLSchema CDMLoaderXMLSchema.xsd">
<CDMDataVersion>
    <Major>3</Major>
    <Minor>0</Minor>
    <Build>19</Build>
    <Delimiter>.</Delimiter>
</CDMDataVersion>

我正在使用的批处理代码是..

    @echo off
  fc D:\SVN\TData\TData.xml Z:\TDataGDDFolders\TData.xml /A > nul

if errorlevel 1 (
    echo.
    echo in SVN
    findstr "<Build>" D:\SVN\TData\TData.xml
    echo.
    echo  in DropBox
    findstr "<Build>" Z:\TDataGDDFolders\TData.xml
    echo.
    echo.
    echo TData files are different.
) else (
    echo.
    echo in SVN
    findstr "<Build>" D:\SVN\TData\TData.xml
    echo.
    echo  in DropBox
    findstr "<Build>" Z:\TDataGDDFolders\TData.xml
    echo.
    echo.
    echo TData files matches.    
)

我正在尝试在批处理代码中添加上述功能,但似乎无法理解如何操作...请帮助..

1 个答案:

答案 0 :(得分:1)

只需重复使用previous answer

中的代码即可
@echo off
    setlocal enableextensions disabledelayedexpansion

    set "file1=%cd%\tdata_1.xml"
    set "file2=%cd%\tdata_2.xml"

    call :compareXML "%file1%" "%file2%" "Major" || ( echo files different & goto :eof )
    call :compareXML "%file1%" "%file2%" "Minor" || ( echo files different & goto :eof )
    call :compareXML "%file1%" "%file2%" "Build" || ( echo files different & goto :eof )

    echo files same

    exit /b

:compareXML file1 file2 taglist
    setlocal enableextensions disabledelayedexpansion

    setlocal enableextensions enabledelayedexpansion
    set "match=" & for %%a in (%~3) do set "match=!match! /c:"^<%%a^>""
    endlocal & set match=%match%

    for /f "tokens=1,2 delims=<> " %%a in ('
        type "%~1" "%~2" 2^> nul ^| findstr /i /l %match%
    ') do if not defined _F1_%%a ( set "_F1_%%a=%%b" ) else (
        setlocal enabledelayedexpansion
        for %%c in ("!_F1_%%a!.") do (
            endlocal 
            if /i not "%%b."=="%%~c" ( endlocal & exit /b 1 ) 
            set "_F1_%%a="
        )
    )
    set _F1_ 2>nul && ( endlocal & exit /b 1 ) || ( endlocal & exit /b 0 )