0

我正在从 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>那里,如果我同时使用排序命令和查找命令,我会注意到更多错误。

任何人都可以帮助我了解发生了什么?

4

0 回答 0