从xml文件中提取一个值,并使用批处理文件将其输出到csv

从xml文件中提取一个值,并使用批处理文件将其输出到csv,xml,batch-file,Xml,Batch File,我需要从文件夹中所有xml文件中的特定xml标记中提取值,并在csv文件的两个单独列中导出值和文件名w/o ext。我已经尝试了以下零运气 xml如下所示: <ICSMXML xmlns="http://www.icsm.com/icsmxml" version="1.0"> <Header> <MsgDelivery> <To> <Credential> <Domain>ICSMID</Dom

我需要从文件夹中所有xml文件中的特定xml标记中提取值,并在csv文件的两个单独列中导出值和文件名w/o ext。我已经尝试了以下零运气

xml如下所示:

<ICSMXML xmlns="http://www.icsm.com/icsmxml" version="1.0">
<Header>
<MsgDelivery>
  <To>
    <Credential>
      <Domain>ICSMID</Domain>
      <Identity>11</Identity>
    </Credential>
  </To>
  <From>
    <Credential>
      <Domain>DUNS</Domain>
      <Identity>039576814</Identity>
    </Credential>
  </From>
  <Sender>
    <Credential>
      <Domain>DUNS</Domain>
      <Identity>039576814</Identity>
    </Credential>
    <UserAgent />
  </Sender>
</MsgDelivery>
<MsgHeader>
  <MessageId>10000095713</MessageId>
  <Timestamp>04/12/2013 10:24:00 AM</Timestamp>

ICSMID
11
邓斯
039576814
邓斯
039576814
10000095713
2013年12月4日上午10:24:00
我需要在文件夹中找到的任何xml文件中解析MessageId的值,并将其与原始文件名w/o ext一起放入csv文件中。最好在第1列中有值,在第2列中有文件名w.o ext

@echo off
call :check_lines < %1 > "%~N1.xml"
exit /b

REM Seek for the start of Data tag
:check_lines
set /P line=
if not "%line%" == "<MessageId>" goto check_lines

REM Copy until the end of Data tag
set /P line=
:put_lines
if "%line%" == "</MessageId>" goto end_lines
set /P line=%line% 
goto put_lines
:end_lines
echo %line%
>>Message.csv
@echo关闭
调用:检查_行<%1>“%~N1.xml”
退出/b
REM查找数据标记的开始
:检查线路
设定/付款行=
如果不是“%line%”==“转到检查行”
REM复制直到数据标记结束
设定/付款行=
:放线
如果“%line%”==“转到结束行”
设置/P行=%line%
去放线
:结束线
回音%行%
>>Message.csv
这应该可以做到:

@echo off
setlocal enabledelayedexpansion
for %%a in (*.xml) do (
call :XMLExtract "%%a" "<MessageID>" location
echo.!location!,%%~na
)
exit /b

:XMLExtract file keystart location
@echo off & setlocal
for /f "tokens=3 delims=<>" %%a in ('Findstr /i /c:%2 "%~1"') do (
   set "loc=%%a" & goto :endloop
)
:endLoop
ENDLOCAL & IF "%~3" NEQ "" (SET %~3=%loc%) ELSE echo.%loc%
exit /b
@echo关闭
延迟扩展
对于(*.xml)中的%%a,请执行以下操作(
调用:XMLExtract“%%a”位置
回声!位置!,%%~na
)
退出/b
:XMLExtract文件密钥开始位置
@echo off和setlocal
对于/f“tokens=3 delims=“%%a in('Findstr/i/c:%2”%~1“)do(
设置“loc=%%a”&转到:结束循环
)
:endLoop
ENDLOCAL&如果“%~3”NEQ”“(设置%%3=%loc%)其他回显。%loc%
退出/b

我运行了代码,但无法生成csv,我在结束后移动了>>Message.csv)并收到了csv,但该csv为空。您需要将该部分保留在循环中。否则,它不会为每个文件写出它。你是否完全按照我写的那样尝试过?我再次复制了代码,只是为了再次检查,确保它是相同的,并且没有收到消息。csv.ah,它都在同一行上。此代码旨在提取单独行上的标记。我必须重新设计它。一旦我在>>Message.csv中添加了它,它就像一个符咒,谢谢你的帮助,非常感谢!!