Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于子节点值删除XML中的节点_Xml_Batch File - Fatal编程技术网

基于子节点值删除XML中的节点

基于子节点值删除XML中的节点,xml,batch-file,Xml,Batch File,目前,我有一个可执行以下操作的 在特定文件夹中查找 解压所有*.zip文件 读取具有四列oldid、oldname、newid、newname的特定 递归查找文件夹中的所有*.xml文件 循环浏览*.xml文件,创建原始bak和潜在修改bak的副本 用新ID、新名称替换旧ID、旧名称 如果修改,则写入XML,删除原始文件,将bak移动到原始文件。 我的问题是这个。对于没有替换的项目,例如,我需要删除整个节点 因此,在我的XML中,我有: <choice id="8" isActive="y

目前,我有一个可执行以下操作的

在特定文件夹中查找 解压所有*.zip文件 读取具有四列oldid、oldname、newid、newname的特定 递归查找文件夹中的所有*.xml文件 循环浏览*.xml文件,创建原始bak和潜在修改bak的副本 用新ID、新名称替换旧ID、旧名称 如果修改,则写入XML,删除原始文件,将bak移动到原始文件。 我的问题是这个。对于没有替换的项目,例如,我需要删除整个节点

因此,在我的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>
当我走过这条路时,我会在我的脑海里一行一行地触摸它们。所以我的问题是,有没有一种方法可以设置一个要读取的分隔符来替换字符串或删除所述节点?或者,由于替换工作正常,请使用替换工具写入空行

所以

变成

<choice id="8" isActive="yes">
</choice>
如果这样做有效,那么是否使用另一批来删除任何空节点

那么,按照后面的思路,为什么会改变>>%BAKFILE%echo。!行!=>如果不是%3=>>%BAKFILE%echo。!线不工作


对不起。你的问题很烦人。首先,你提供了太多与问题无关的信息。然而,当您描述您的问题时,您还不够清楚:是否有一种方法可以设置要读取的分隔符来替换字符串或删除所述节点

如果这是相关循环:

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>
不管怎样,我还是不明白这些东西和你真正的问题有什么关系

如果你真正的问题是:当…时如何取消整个空节点的输出,那么我建议你完成。。。以非常清晰的方式分开,以便我们知道要解决的问题。

@ECHO OFF SETLOCAL 对于courses.csv do中的/f标记=1-4 delims=,%%a 集合_oID=%%a 设置_oName=%%b 设置nID=%%c 设置nName=%%d 调用:newprocessLine 暂停 后藤:eof :newprocessLine ::模拟由for/r定位的xml文件 设置sourcefile=q21169335.txt 设置destfile=q21169335.txt.new 删除%destfile%2>nul 电话:zap$ 集选边= 对于/f delims=%sourcefile%DO中的%%a 设置行=%%a delims下方的REM行=重定向器选项卡空间 FOR/f delims=%%t在%%a DO SET标记中=%%t 电话:rep FC%sourcefile%%destfile% 后藤:eof ::对于每行,缓冲区(如果在选择节点中)或输出 :rep 如果%tag%==选择集choicenode=Y并设置targetnode= 如果定义了choicenode调用:buffer ELSE调用:out line 如果%tag%==/选择转到eciohctag 后藤:eof ::保存并标记是否为目标 :缓冲区 设置/a计数$+=1 设置$%count$%=%line% 调用集换行符=%%行:%\u oID%=%% 如果不是%line%==%newline%,则设置targetnode=Y 后藤:eof ::处理所需的任何更改 ::如果没有新ID和新名称,请删除节点 :eciohctag 如果未定义targetnode,则转到putbuffer 如果未定义nID如果未定义nName转到noput 对于1,1中的/l%%z,%count$%DO 调用集$%%z=%%$%%z:%%\u oID%%=%nID%% 调用集$%%z=%%$%%z:%%\u oName%%=%nName%% :putbuffer 对于1,1中的/l%%z,%count$%DO调用:out$%%z :没有 电话:zap$ 集选边= 后藤:eof ::删除从%1开始的所有环境变量 :zap 对于/f delims==%z在“集合%1 2^>num”中执行集合%%z= 设置/a计数%1=0 后藤:eof :出去 对于/f令牌=1*delims==%%x,在“设置%1”中执行>>%destfile%ECHO%%y 后藤:eof 我建议您理清文件复制/备份生成方案。在我看来,你正在复制文件并立即删除它们

考虑到这一点,我生成了这个版本。本质上,它处理同一个文件q21169335.txt,即.XML示例的副本,并生成一个新文件q21169335.txt.new三次,在FC之后停止以显示差异。对于courses.csv的每一行,三次显示一次,以显示每次迭代所做的单个更改

本质上,该方法是检测标记,缓冲choice和/或choice之间的任何行,如果缓冲的节点包含旧的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 . . . 

以何种方式失败?

使用代码将.txt替换为.xml似乎失败了?对不起,把你弄糊涂了。这是我的问题。我有一个空节点,我需要的是完全删除空节点,如果这是结果输出。
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 . . .