2014-01-16 182 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 –