2

我有一个 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>。这是一个类似的例子,我还有更多。所以我需要一些帮助。

4

3 回答 3

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。

批处理确实不是适合该任务的工具。

我假设“之前”是指“在指定标签出现之前的行”而不是“直接在标签之前” - 即在前导> >和标签之间。

由于提名的插入文本显然是人为的,如果您需要的真实文本放在一个名为 say 的文件中,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

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

于 2013-10-24T09:36:21.070 回答
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
于 2013-10-24T14:06:21.190 回答
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您自己的路径即可。并备份您的目录..

于 2013-10-24T07:43:54.777 回答