Xml修改的批处理文件

时间:2013-10-24 07:26:11

标签: batch-file

我有一个xml文件,我必须根据一些规则进行修改,我想知道我们可以在批处理脚本中执行此操作。假设以下是xml文件的样本

> > <conf-article article-type="research" content-type="----"
> > dtd-version="---" open-access="no" xml:lang="en" lifecycle="final">
> > <conf-front>
    <conf-proc-meta>
    <conf-proc-id
> > conf-proc-id-type="conf-acronym">cccc</conf-proc-id>
> > <conf-proc-title-group>

我希望插入以下行

<!--Delivery Date: 07/23/2013-->
<!--XML Script: sdfasdfdfs-->
<!--Batch: sdfsdfdssfs-->

<conf-front>标签之前。这是一个例子,我还有更多。所以我需要一些帮助。

3 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
(
 FOR /f "delims=" %%a IN (q19559569.xml) DO (
  ECHO("%%a"|FIND "<conf-front>" >NUL
  IF NOT ERRORLEVEL 1 (
    ECHO(^<!--Delivery Date: 07/23/2013--^>
    ECHO(^<!--XML Script: sdfasdfdfs--^>
    ECHO(^<!--Batch: sdfsdfdssfs--^>
  )
  ECHO(%%a
 )
)>newfile.xml
GOTO :EOF

其中q19559569.xml是您的原始文件,并且已创建newfile.xml。

Batch实际上不适合完成任务。

我假设“之前”是指“在指定标签出现之前的行上”,而不是“直接在标签之前” - 也就是说,在前导> >和标签之间

由于提名的插入文本显然是人为的,如果您需要的真实文本放在名为insertme.txt的文件中,则用

替换三个ECHO语句
type insertme.txt

应该更灵活。


@ECHO OFF
SETLOCAL
FOR %%x IN (*.xml) DO (
 FOR /f "delims=" %%a IN ('type "%%x"') DO (
  ECHO("%%a"|FIND "<conf-front>" >NUL
  IF NOT ERRORLEVEL 1 (
    ECHO(^<!--Delivery Date: 07/23/2013--^>
    ECHO(^<!--XML Script: sdfasdfdfs--^>
    ECHO(^<!--Batch: sdfsdfdssfs--^>
  )
  ECHO(%%a
 )
)>"%%~nx.new"
GOTO :EOF

此mod应该从现有的.new文件中生成一个扩展名为.xml的新文件

答案 1 :(得分:1)

这是处理一个包含xml文件的文件夹的另一种解决方案。

它使用Aacini的一个名为findrepl.bat的帮助程序批处理文件 - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

findrepl.bat放在与批处理文件相同的文件夹中,并在测试后删除REM以使文件的.tmp版本覆盖原始文件。

@echo off
for %%a in (*.xml) do (
   echo processing "%%a"
      type "%%a" |findrepl "." /e:"<conf-front>" /o:-1:-1 >"%%a.tmp"
         >>"%%a.tmp" echo ^<!--Delivery Date: 07/23/2013--^>
         >>"%%a.tmp" echo ^<!--XML Script: sdfasdfdfs--^>
         >>"%%a.tmp" echo ^<!--Batch: sdfsdfdssfs--^>
      type "%%a" |findrepl /v "." /e:"<conf-front>" /o:-1:-1 >>"%%a.tmp"
   REM move "%%a.tmp" "%%a"
)
pause

答案 2 :(得分:0)

    @echo off

    ::get the line before desired tag
    for /f "tokens=1 delims=:" %%L in ('findstr /n "<conf-front>" some.xml') do set /a line=%%L-1

    ::create empty file 
    break>"%temp%\empty"

    ::get first <%line%> lines of the file 
    fc "%temp%\empty" "some.xml" /lb  %line% /t |more +4 | findstr /B /E /V "*****" >temp.xml

    :: add additional content
    echo ^<!--Delivery Date: 07/23/2013--^>  >> temp.xml
    echo ^<!--XML Script: sdfasdfdfs--^>  >> temp.xml
    echo ^<!--Batch: sdfsdfdssfs--^>  >> temp.xml

    ::get last <%line%> lines of the file
    type "some.xml" | more +%line%  >> temp.xml

    ::delete temp empty file
    del /Q /F "%temp%\empty"

这将创建temp.xml文件,您可以检查它是否符合您的需求,然后将其复制到旧文件上。请在最后 <conf-front>标记之前设置此文件,以便我希望如此这只是其中之一。并且在代码中随处可以更改some.xml和xml的名称。

编辑〜对文件夹中的所有.xml执行此操作(不会影响子文件夹)

 @echo off

 rem cd /d "c:\some_dir"

::create empty file 
break>"%temp%\empty"

:: iterate trough the xml files
setlocal enableDelayedExpansion
for %%X in (*.xml) do (


    set "line="
    ::get the line before desired tag
    for /f "tokens=1 delims=:" %%L in ('findstr /n "<conf-front>" %%~dpsnxX') do set /a line=%%L-1

    ::only in case the tag is presented
    if defined line (

        ::get first <%line%> lines of the file 
        fc "%temp%\empty" "%%~dpsnxX" /lb  !line! /t |more +4 | findstr /B /E /V "*****" >%temp%\temp.%%~nX.xml

        :: add additional content
        echo ^<^^!--Delivery Date: 07/23/2013--^>  >>"%temp%\temp.%%~nX.xml"
        echo ^<^^!--XML Script: sdfasdfdfs--^>  >>"%temp%\temp.%%~nX.xml"
        echo ^<^^!--Batch: sdfsdfdssfs--^>  >>"%temp%\temp.%%~nX.xml"

        ::get last <%line%> lines of the file
        type "%%~dpsnxX" | more +!line!  >>"%temp%\temp.%%~nX.xml"

    )

)
endlocal

:: replace the file with these in temp folder with new content
for %%X in (*.xml) do (
    move /Y "%temp%\temp.%%~nX.xml" "%%~dpnxX" 2>nul
)

::delete temp empty file
del /Q /F "%temp%\empty"

只需用自己的路径更改c:\some_dir。并备份你的目录..