我正在从 XML 文件中提取一些特定的行以生成一些 .TXT 文件。真正的 XML 要复杂得多,所以这是一个非常简化的版本,只是为了帮助<path>显示FOR /F "tokens=* delims= " %%X in ('findstr "<path> <descr>" "%input_xml%"').
这是 XML ( xmlfile_fruits.xml):
<fruit>
<path>./111/222/banana.zip</path>
<descr>xxx / yyy / zzz</descr>
</fruit>
<fruit>
<path>./111/222/orange.zip</path>
<descr>N/A</descr>
</fruit>
<fruit>
<path>./111/222/apple.zip</path>
<descr></descr>
</fruit>
<fruit>
<path>./111/222/lemon.zip</path>
<descr>xxx / yyy / zzz</descr>
</fruit>
<fruit>
<path>./111/222/pineaple.zip</path>
<descr>abc/def/ghi</descr>
</fruit>
<fruit>
<path>./111/222/banana.zip</path>
<descr></descr>
</fruit>
这是我用来获取 3 个列表的批次,一个包含来自<path>and的内容<descr>,另一个包含<descr>仅来自的内容,第三个<descr>包含唯一值的列表。
@echo off
setlocal enabledelayedexpansion
set "input_xml=xmlfile_fruits.xml"
if exist List_path.txt del List_path.txt
if exist List_descr.txt del List_descr.txt
FOR /F "tokens=* delims= " %%X in ('findstr "<path> <descr>" "%input_xml%"') do (
set "line=%%X"
if "!line:~0,6%!"=="<path>" (
set "path=!line:~6,-7!"
::get a list with filename.extension only
for %%I in ("!path!") do echo %%~nI%%~xI>>List.txt
) else (
set "descr=!line:~7,-8!"
::get the lists
echo !descr!>>List.txt
echo !descr!>>List_descr.txt
)
)
::remove duplicate lines
if exist "List_unique_descr.txt" del "List_unique_descr.txt"
::scan all the <descr> from List_descr.txt
FOR /F "tokens=* usebackq delims=" %%8 in ("List_descr.txt") do (
findstr /x /c:"%%~8" "List_unique_descr.txt">NUL || echo %%8>>List_unique_descr.txt
) >nul 2>nul
pause
发生了一些错误'findstr "<path> <descr>" "%input_xml%"',特别是字符串<path>。由于某种原因,我的代码的最后一部分不起作用,并且"List_unique_descr.txt"没有正确生成。
这就是我得到的:
xxx / yyy / zzz
N/A
ECHO is off.
xxx / yyy / zzz
abc/def/ghi
ECHO is off.
应该是这样的:
xxx / yyy / zzz
N/A
ECHO is off.
abc/def/ghi
但是,如果我们将单词<path>in替换Findstr为任何不同的单词,<name>例如,代码就可以正常工作。当然,也需要对<path>XML 文件进行替换。但这不是解决方案,因为我需要尊重 XML 结构。
而且,如果我离开<path>那里,如果我同时使用排序命令和查找命令,我会注意到更多错误。
任何人都可以帮助我了解发生了什么?