2013-10-24 128 views
2

我有一个xml文件,我必须根据一些规则进行修改,我想知道我们可以在批处理脚本中执行此操作。假设下面是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> tag.This就是这样一个例子,我有一些more.so我需要一些帮助这一点。

+0

''总是'第三'行吗?第1行和第2行总是一样还是动态的? – foxidrive

+0

它可以是第四或第五行总是 – Mallik

回答

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文件,你可以检查它是否符合你的需求,然后在你的旧file.Will设置此之前最后<conf-front>标签,所以我希望这里只有这一个复制kind.And更改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用自己path.And备份你的目录..

+0

我有一个文件夹中有不同名称的100个xml文件,所以如何运行这个代码来更改所有的xml文件。 – Mallik

+0

将编辑答案。 – npocmaka

+0

你现在可以检查它吗? – npocmaka

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已创建。

批处理真的不是一个适合这项任务的工具。

我假设“之前”的意思是“在提名标签出现之前的行上”而不是“直接在标签之前” - 即在前导> >和标签之间。

由于提名插入的文本显然是人为的,如果你需要真正的文本被放置在一个名为说insertme.txt然后用

type insertme.txt 

更换三个ECHO发言应更加灵活。


@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应该从现有.xml文件

+0

如果我想脚本本身运行的文件夹中的所有xml文件呢?它应该写入相同的文件,其余内容不应该被删除。 – Mallik

+0

真的需要更具体。你是否想运行所有.xmls生成一个对应于每个单独的.xml的新文件,或者是一个包含原始集合中所有数据的巨大.xml,每个数据都进行了调整?除了在包含''的行之前注入三行外,此批不应该改变任何内容'您可以使用'FC your.xml newfile.xml'来检查。 – Magoo

+0

不是一个巨大的xml文件。它应该写入相应的文件中 – Mallik

1

产生与扩展.new一个新的文件下面是另一种解决方案来处理一个完整的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