使用批处理文件获取未格式化XML文件中特定标记之间的所有字符串

使用批处理文件获取未格式化XML文件中特定标记之间的所有字符串,xml,string,parsing,batch-file,Xml,String,Parsing,Batch File,我正在尝试获取XML文件中两个标记之间的字符串,以适应我在中找到的解决方案 这是我得到的批处理文件: @echo off setlocal EnableDelayedExpansion (for /F "delims=" %%a in ('findstr /I /L "<Name>" contacts.xml') do ( set "line=%%a set "line=!line:*<Name>=!" for /F "delims=<" %%b

我正在尝试获取XML文件中两个标记之间的字符串,以适应我在中找到的解决方案

这是我得到的批处理文件:

@echo off
setlocal EnableDelayedExpansion

(for /F "delims=" %%a in ('findstr /I /L "<Name>" contacts.xml') do (
   set "line=%%a
   set "line=!line:*<Name>=!"
   for /F "delims=<" %%b in ("!line!") do echo %%b
)) > list.txt
现在,当XML格式化后,我得到了所有的名称

<List>
   <Contacts>
      <Row>
         <Name>Carlos</Name>
         <Path>\Some\path\1</Path>
         <Hidden>False</Hidden>
      </Row>
      <Row>
         <Name>Fernando</Name>
         <Path>\Some\path\2</Path>
         <Hidden>False</Hidden>
      </Row>
      <Row>
         <Name>Luis</Name>
         <Path>\Some\path\3</Path>
         <Hidden>False</Hidden>
      </Row>
      <Row>
         <Name>Daniel</Name>
         <Path>\Some\path\4</Path>
         <Hidden>False</Hidden>
      </Row>
   </Contacts>
</List>
卡洛斯

费尔南多

路易斯

丹尼尔

但当XMLThis是如何生成的,在1行中,我只得到了第一个名字

<List><Contacts><Row><Name>Carlos</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row><Row><Name>Fernando</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row><Row><Name>Luis</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row><Row><Name>Daniel</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row></Contacts></List>
卡洛斯


我应该对批处理文件进行哪些更改,以使其正确解析未格式化的XML文件?

在回答之前,我应该指出您的单行XML缺少一个close标记,并且所有元素都包含Carlos。因此,在测试我的答案时,我使用了以下XML:

<List><Contacts><Row><Name>Carlos</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row><Row><Name>Fernando</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row><Row><Name>Luis</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row><Row><Name>Daniel</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row></Contacts></List>

在回答之前,我应该指出您的单行XML缺少一个close标记,并且所有元素都包含Carlos。因此,在测试我的答案时,我使用了以下XML:

<List><Contacts><Row><Name>Carlos</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row><Row><Name>Fernando</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row><Row><Name>Luis</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row><Row><Name>Daniel</Name><Path>\Some\path\1</Path><Hidden>False</Hidden></Row></Contacts></List>

正如Adriano在他的评论中暗示的那样,不赞成通过正则表达式等强大工具解析XML。使用批处理解析XML要糟糕得多

纯本机批处理无法处理长度超过8191字节的文本行,除非您使用涉及FC命令的特殊技术-相信我,您不想这样做。没有理由期望XML文件小于8191字节,因此简而言之,您不能使用本机批处理命令解析作为一个连续行存在的未格式化XML

我写了一封信。它是一个混合JScript/批处理脚本,从XP开始在任何Windows机器上本机运行。我建议将JREPL.BAT放在我使用c:\utils的文件夹中,然后将该文件夹包含在PATH变量中

以下JREPL.BAT命令可用于在大多数简单场景下解析出您的名称,前提是您从未拥有嵌套元素。但是,与任何正则表达式解决方案一样,此代码并不适合所有情况

jrepl[\s\s]*$1/m/jmatch/f contacts.xml/o list.txt
由于JREPL是一个批处理脚本,因此如果要在另一个批处理脚本中使用该命令,则必须使用CALL JREPL。

正如Adriano在其评论中暗示的那样,不赞成通过正则表达式等强大工具解析XML。使用批处理解析XML要糟糕得多

纯本机批处理无法处理长度超过8191字节的文本行,除非您使用涉及FC命令的特殊技术-相信我,您不想这样做。没有理由期望XML文件小于8191字节,因此简而言之,您不能使用本机批处理命令解析作为一个连续行存在的未格式化XML

我写了一封信。它是一个混合JScript/批处理脚本,从XP开始在任何Windows机器上本机运行。我建议将JREPL.BAT放在我使用c:\utils的文件夹中,然后将该文件夹包含在PATH变量中

以下JREPL.BAT命令可用于在大多数简单场景下解析出您的名称,前提是您从未拥有嵌套元素。但是,与任何正则表达式解决方案一样,此代码并不适合所有情况

jrepl[\s\s]*$1/m/jmatch/f contacts.xml/o list.txt
由于JREPL是一个批处理脚本,因此如果要在另一个批处理脚本中使用该命令,则必须使用CALL JREPL。

批处理文件与要处理的数据的格式密切相关。如果数据发生更改,通常需要新的批处理文件。下面的纯批处理文件提取示例未格式化xml文件的名称,只要行少于8190个字符

@echo off
setlocal EnableDelayedExpansion

for /F "delims=" %%a in (contacts.xml) do (
   set "line=%%a"
   for %%X in (^"^
% Do NOT remove this line %
^") do for /F "delims=" %%b in ("!line:>=%%~X!") do (
      if /I "!field!" equ "<Name" for /F "delims=<" %%c in ("%%b") do echo %%c
      set "field=%%b"
   )
)

%%X的第一个选项是将换行符指定给%%X可替换参数的方法。在那之后!行:|=%%~X!part用于用换行符替换每个|字符。最后,第二个for/F命令以通常的方式处理结果行。

批处理文件与要处理的数据的格式密切相关。如果数据发生更改,通常需要新的批处理文件。下面的纯批处理文件提取示例未格式化xml文件的名称,只要行少于8190个字符

@echo off
setlocal EnableDelayedExpansion

for /F "delims=" %%a in (contacts.xml) do (
   set "line=%%a"
   for %%X in (^"^
% Do NOT remove this line %
^") do for /F "delims=" %%b in ("!line:>=%%~X!") do (
      if /I "!field!" equ "<Name" for /F "delims=<" %%c in ("%%b") do echo %%c
      set "field=%%b"
   )
)

%%X的第一个选项是将换行符指定给%%X可替换参数的方法。在那之后!行:|=%%~X!part用于用换行符替换每个|字符。最后,第二个for/F命令以通常的方式处理生成的行。

Drop for,并将文件视为单行。不管是否使用单个环境变量,都可以重复执行,直到找到为止。顺便说一句,在讨论是否可以/应该使用正则表达式解析HTML/XML后…我们将进入下一步…批处理文件;哈哈,说真的,你只有在控制得很好的情况下才能这么做。空名称可以是,字符串可以包含&character;或者至少有CDATA。嗨,阿德里亚诺,谢谢你的解释,但我需要更多的细节,我对这个主题不是很熟练。这里是分割:和阅读文件只是两个例子!不一定是最好的。请注意,它们不涉及ot

我提到过她的问题,所以你可能需要手工处理。作为选项……您是否考虑过从批处理文件中调用的VBScript/JScript脚本?感谢阿德里亚诺的资源,因为现在我不能使用任何其他工具来代替本系统中的本地批处理。顺便说一句,在讨论是否可以/应该使用正则表达式解析HTML/XML后…我们将进入下一步…批处理文件;哈哈,说真的,你只有在控制得很好的情况下才能这么做。空名称可以是,字符串可以包含&character;或者至少有CDATA。嗨,阿德里亚诺,谢谢你的解释,但我需要更多的细节,我对这个主题不是很熟练。这里是分割:和阅读文件只是两个例子!不一定是最好的。请注意,它们没有解决我提到的其他问题,因此您可能需要手动完成。作为选项……您是否考虑过从批处理文件中调用的VBScript/JScript脚本?谢谢阿德里亚诺的资源,因为现在我不能使用任何其他工具来比这个系统中的本地批处理。非常好!这是一种正确、可靠的方法。比我使用正则表达式要好得多。太好了。关于解析/编辑XML有很多问题。一个常用的工具会让很多人的生活变得轻松。我正计划创建一个工具,但最近我没有多少空闲时间。MSXML2.XMLHTTP对象也是一个不错的选择,但是DOM解析器更好。这似乎是一个很好的解决方案,我只知道这方面的基本知识。但我会试试的,对问题的完美描述。@carlos:只是好奇,你试过这个脚本吗?是什么让你最终选择了Aacini的解决方案?问题是,除了纯批量,我不能在这个系统中使用其他任何东西,Aacini的解决方案工作得很好,我会尽快尝试你的解决方案,因为这似乎是一种正确的方法。非常好!这是一种正确、可靠的方法。比我使用正则表达式要好得多。太好了。关于解析/编辑XML有很多问题。一个常用的工具会让很多人的生活变得轻松。我正计划创建一个工具,但最近我没有多少空闲时间。MSXML2.XMLHTTP对象也是一个不错的选择,但是DOM解析器更好。这似乎是一个很好的解决方案,我只知道这方面的基本知识。但我会试试的,对问题的完美描述。@carlos:只是好奇,你试过这个脚本吗?是什么让你最终选择了Aacini的解决方案?问题是,除了纯批处理,我不能在这个系统中使用其他任何东西,Aacini的解决方案工作得很好,我会尽快尝试你的解决方案,因为这似乎是一种正确的方法。感谢Aacini,使用本机批处理,这个解决方案工作得很好。我将不得不考虑8190字节的限制。@ AcSiNi:你能教我这个脚本的含义吗?它的任何方式,但有兴趣知道工作,感谢AcCII,使用本机批处理,这个解决方案工作完美。我将不得不考虑8190字节的限制。AAcIn:你能教我这个脚本的含义吗?它的任何工作方式,但有兴趣知道的工作,感谢精彩的解释似乎我不能做到这一点纯粹的批处理。目前我无法向系统添加任何实用程序,但我会尽快尝试您的解决方案。感谢您的精彩解释,我似乎无法使用纯批处理。目前我无法向系统添加任何实用程序,但我会尽快尝试您的解决方案。