2013-10-24 159 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