从xml文件获取标记值并使用批处理脚本

时间:2016-07-29 14:41:16

标签: xml csv batch-file

我有xml文件,需要提取所需的标签值,并在csv文件中输出结果,标签名称包含标题,低于它的值。

到目前为止,我尝试过获取xml标记和值,但所有结果都显示在1列中,而不是表格式。

xml文件内容(部分文件内容):

<RSP>
<HSI>
<SN>CZ9V      </SN>
<SP>Pro Gen8</SP>
<UUID>C9V</UUID>
</HSI>
<STP>3</STP>
<cUUID>343-11</cUUID>
<NICS>
<NIC>
<PORT>1</PORT>
<MACADDR>01:51:f2</MACADDR>
</NIC>
<NIC>
<PORT>1</PORT>
<MACADDR>00:17</MACADDR>
</NIC>
<NIC>
<PORT>2</PORT>
<MACADDR>77:28:02</MACADDR>
</NIC>
<NIC>
<PORT>3</PORT>
<MACADDR>00:04</MACADDR>
</NIC>
<NIC>
<PORT>4</PORT>
<MACADDR>00:06</MACADDR>
</NIC>
</NICS>
</RSP>

输出来自output.csv文件:

SN,SP,UUID,MACADDR,cUUID
CZ9V
Pro Gen8
C9V

01:51:F2    343-11

我希望得到的是:

SN,SP,UUID,MACADDR,cUUID
CZ9V,Pro Gen8,C9V,01:51:f2,343-11

当我们在电子表格中打开output.csv时,如果需要使用过滤器选项,上述结果应该很容易过滤。

到目前为止的代码是:

echo SN,SP,UUID,MACADDR,cUUID> %outFile%
set req_tags=SN SP UUID MACADDR cUUID
for %%a in (%inFile%) do (
for %%c in (%req_tags%) do (
set "found="
set search_tag=%%c
for /f "tokens=2 delims=><  " %%b in ( ' type "%%a" ^|findstr /i !search_tag! ' ) do set found=%%b
 if defined found >> "%outFile%" echo !found! 
)
)

需要在output.csv文件中的相应标记名下获取标记vlaue。

2 个答案:

答案 0 :(得分:0)

我抓了一把。你走在正确的轨道上。以下代码看起来适用于您发布的示例数据,它将继续适用于您在HSI元素中添加的任何其他项目。

您需要修改的唯一内容是CSV标题行,但您可以选择将其作为参数传递给批处理文件或硬编码批处理文件本身内的值,如下所示:

@echo off
setlocal enabledelayedexpansion
set inFile="C:\tests\xmltocsv.txt"
set outFile="C:\tests\output.csv"
if exist %outFile% del %outFile%
set csvline=
echo SN SP UUID > %outFile%
(for /F "delims=" %%a in ('findstr /I /L /V "^<HSI" %inFile%') do (
  if "%%a" EQU "</HSI>" (
    echo !csvline! & set csvline=
  ) ELSE (
   set line=%%a & set "line=!line:*>=!" & for /F "delims=<" %%b in ("!line!") do (IF "%%b" NEQ " " (IF "!csvline!" NEQ "" (set csvline=!csvline! %%b) ELSE (set csvline=%%b)))
  )
)) >> %outFile%

答案 1 :(得分:0)

鉴于要求有所改变,我选择发布新答案而不是编辑原始答案。不确定这是否是做事的方式,但是,嘿,我尽我所能...... :)

这是一个不关心XML层次结构的版本,它只是从指定元素列表中提取标记值。但是,请注意,正如我之前解释的那样,多个子元素可能属于公共父元素的情况(即使XML层次结构没有反映它)在此处处理 。但是OP的请求输出在一行上:

parseInt(totaltopay.value)*0.19/1.19