Я извлекаю некоторые специфические строки из файла 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>
и <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>
в Findstr
на другое, например, <name>
, код будет работать нормально.Конечно, в XML-файле также необходимо заменить <path>
.Но это не решение, потому что мне нужно уважать структуру XML, как она есть.
И, если я оставлю <path>
, я замечу еще несколько ошибок, если использую команду сортировки и команду поискаа также.
Кто-нибудь может помочь мне понять, что происходит?