我有一个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>
标签之前。这是一个例子,我还有更多。所以我需要一些帮助。
答案 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
。并备份你的目录..