2014-01-16 226 views
0

目前,我有一個script是執行以下操作:刪除節點基於子節點值

  1. 看起來在一個特定的文件夾
  2. 解壓所有的* .zip文件
  3. 讀取特定CSV file那有四列(OLDID,使用oldName,NEWID NEWNAME)
  4. 查找遞歸地在文件夾中所有* .xml文件(sample.xml
  5. 循環通過* .xml文件,創建拷貝(或iginal李明博&潛在修改BAK)
  6. 取代OLDID,使用oldName與NEWID,NEWNAME
  7. 如果修改,寫XML,刪除原始文件,移動李明博原始。

我的問題是這樣的。對於沒有替換的項目(例如,line 3 of csv),我需要刪除整個節點。

所以在我的XML,我有這樣的:

<choice id="8" isActive="yes"> 
    <name><![CDATA[<font color='#0000FF' ><u>Mentoring Tools</u> </font>]]></name> 
    <url><![CDATA[http://olc.inside.domain.com/olc/apps/pro/DeepLinking/LoadAsset.cfm?coursename=mgmt_10_a03_bs_enus]]></url> 
</choice> 

當我走過這一點,我會在我的current loop摸他們一行行。所以我的問題是,有沒有辦法設置一個分隔符來讀取以替換字符串或刪除所述節點?或者,因爲替換工作,使用替換工具寫一個空行?

所以,

<choice id="8" isActive="yes"> 
    <name><![CDATA[<font color='#0000FF' ><u>Mentoring Tools</u> </font>]]></name> 
    <url><![CDATA[http://olc.inside.domain.com/olc/apps/pro/DeepLinking/LoadAsset.cfm?coursename=mgmt_10_a03_bs_enus]]></url> 
</choice> 

成爲

<choice id="8" isActive="yes"> 
</choice> 

如果一切正常,然後用另一個批處理刪除任何空<choice>節點?

因此,隨着這個後來的思路,爲什麼這個變化>> "%BAKFILE%" echo.!LINE! =>if not "%~3"=="" >> "%BAKFILE%" echo.!LINE!不工作?

Related Question #21153875

回答

0

不好意思。你的問題是一個惱人的問題。首先,你提供了太多與問題無關的信息。但是,當您描述您的問題時,您還不夠清楚:「是否有設置分隔符的方法來替換字符串或刪除所述節點?」。

如果是相關的循環:

REM Walk through XML Lines 
for /F "delims=" %%U in (%~1) do (
    set LINE=%%U 
    setlocal enabledelayedexpansion 

    if not "!LINE!" == "!LINE:%~2=!" (
     set LINE=!LINE:%~2=%~3! 
     set modified=!string:%~2=%~3! 

    ) 
    >> "%BAKFILE%" echo.!LINE! 
    endlocal 
) 

...這是輸入數據:

<choice id="8" isActive="yes"> 
    <name><![CDATA[<font color='#0000FF' ><u>Mentoring Tools</u> </font>]]></name> 
    <url><![CDATA[http://olc.inside.domain.com/olc/apps/pro/DeepLinking/LoadAsset.cfm?coursename=mgmt_10_a03_bs_enus]]></url> 
</choice> 

...然後我不明白,在這種情況下,輸出(或者應該是,或者你想成爲)這樣的:

<choice id="8" isActive="yes"> 
</choice> 

不管怎樣,我還是不明白這一切的東西是如何與你的real問題。

如果你真正的問題是:「如何取消整個空<choice...> </choice>節點的輸出...」,那麼我建議你以非常清晰的方式完成「...」部分,以便我們知道什麼是要解決的問題。

+0

很抱歉讓您困惑。這是我的問題。我有一個空節點''我需要的是空節點被完全刪除,如果這是結果輸出。 –

0
@ECHO OFF 
SETLOCAL 
for /f "tokens=1-4 delims=," %%a in (courses.csv) do (
set "_oID=%%a" 
set "_oName=%%b" 
set "nID=%%c" 
set "nName=%%d" 
call :newprocessLine 
PAUSE 
) 
GOTO :eof 

:newprocessLine 
:: Simulate xml-file-located-by-for/r 
SET "sourcefile=q21169335.txt" 
SET "destfile=q21169335.txt.new" 
DEL %destfile% 2>nul 

CALL :zap $ 
SET "choicenode=" 
FOR /f "delims=" %%a IN (%sourcefile%) DO (
SET "line=%%a" 
REM line below delims=redirectors TAB space 
FOR /f "delims=<> " %%t IN ("%%a") DO SET "tag=%%t" 
CALL :rep 
) 

FC %sourcefile% %destfile% 

GOTO :eof 

:: with each line, buffer if in choice node else output 
:rep 
IF "%tag%"=="choice" SET choicenode=Y&SET "targetnode=" 
IF DEFINED choicenode (CALL :buffer) ELSE (CALL :out line) 
IF "%tag%"=="/choice" GOTO eciohctag 
GOTO :eof 

:: save and flag whether target 
:buffer 
SET /a count$+=1 
SET "$%count$%=%line%" 
CALL SET "newline=%%line:%_oID%=%%" 
IF NOT "%line%"=="%newline%" SET targetnode=Y 
GOTO :eof 

:: Process any changes required 
:: If no new ID and no new Name, eliminate node 
:eciohctag 
IF NOT DEFINED targetnode GOTO putbuffer 
IF NOT DEFINED nID IF NOT DEFINED nName GOTO noput 
FOR /l %%z IN (1,1,%count$%) DO (
CALL SET "$%%z=%%$%%z:%_oID%=%nID%%%" 
CALL SET "$%%z=%%$%%z:%_oName%=%nName%%%" 
) 
:putbuffer 
FOR /l %%z IN (1,1,%count$%) DO (CALL :out $%%z) 

:noput 
CALL :zap $ 
SET "choicenode=" 
GOTO :eof 

:: remove all envvars starting %1 
:zap 
FOR /f "delims==" %%z IN ('set %1 2^>nul') DO SET "%%z=" 
SET /a count%1=0 
GOTO :eof 

:out 
FOR /f "tokens=1*delims==" %%x IN ('set %1') DO >>%destfile% ECHO(%%y 
GOTO :eof 

我建議你整理一下你的文件複製/備份生成方案。在我看來,你正在複製文件,並立即刪除它們...

考慮到這一點,我已經生成了這個版本。本質上,它處理相同的文件q21169335.txt(您的.XML示例的副本),並生成一個新文件q21169335.txt.new三次,在FC之後停止顯示差異。 courses.csv的每一行都有三次顯示每次迭代所做的個別更改。

本質上,該方法是檢測標記,緩衝choice/choice之間的所有行,並且緩衝節點是否包含old-id字符串,然後處理該節點,用新的數據替換舊數據。

如果新數據既沒有新名稱也沒有新ID,則跳過該節點。


結果時,對文件數據運行發佈到github上:

Comparing files q21169335.xml and Q21169335.XML.NEW 
***** q21169335.xml 
<choice id="9" isActive="yes"> 
<name><![CDATA[<font color='#0000FF' ><u>Mentoring Effectively</u> </font>]]></name> 
<url><![CDATA[http://olc.inside.domain.com/olc/apps/pro/DeepLinking/LoadAsset.cfm?coursename=mgmt_10_a01_bs_enus]]></url> 
</choice> 
***** Q21169335.XML.NEW 
<choice id="9" isActive="yes"> 
<name><![CDATA[<font color='#0000FF' ><u>Essential Mentoring Techniques</u> </font>]]></name> 
<url><![CDATA[http://olc.inside.domain.com/olc/apps/pro/DeepLinking/LoadAsset.cfm?coursename=mgmt_39_a01_bs_enus]]></url> 
</choice> 
***** 

Press any key to continue . . . 
Comparing files q21169335.xml and Q21169335.XML.NEW 
***** q21169335.xml 
<choice id="7" isActive="yes"> 
<name><![CDATA[<font color='#0000FF' ><u>Mentoring as a Manager</u> </font>]]></name> 
<url><![CDATA[http://olc.inside.domain.com/olc/apps/pro/DeepLinking/LoadAsset.cfm?coursename=mgmt_10_a02_bs_enus]]></url> 
</choice> 
***** Q21169335.XML.NEW 
<choice id="7" isActive="yes"> 
<name><![CDATA[<font color='#0000FF' ><u>Essential Mentoring Techniques</u> </font>]]></name> 
<url><![CDATA[http://olc.inside.domain.com/olc/apps/pro/DeepLinking/LoadAsset.cfm?coursename=mgmt_39_a02_bs_enus]]></url> 
</choice> 
***** 

Press any key to continue . . . 
Comparing files q21169335.xml and Q21169335.XML.NEW 
***** q21169335.xml 
</choice> 
<choice id="8" isActive="yes"> 
<name><![CDATA[<font color='#0000FF' ><u>Mentoring Tools</u> </font>]]></name> 
<url><![CDATA[http://olc.inside.domain.com/olc/apps/pro/DeepLinking/LoadAsset.cfm?coursename=mgmt_10_a03_bs_enus]]></url> 
</choice> 
<choice id="9" isActive="yes"> 
***** Q21169335.XML.NEW 
</choice> 
<choice id="9" isActive="yes"> 
***** 

Press any key to continue . . . 

以何種方式失敗?

+0

使用代碼替換.txt與.xml似乎失敗? https://gist.github.com/wpsmith/8542453 –