我有xml文件,需要提取所需的标签值,然后将结果输出到csv文件中,标签名称为header,并且标题的值位于其下方。
到目前为止,我尝试过获取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。
鉴于要求有所变化,我选择发布一个新答案,而不是编辑原始答案。不知道这是否是做事的方式,但是,嘿,我尽力了... :)
这是一个不关心XML层次结构的版本,它只是从指定元素列表中提取令牌值。但是,请注意,我刚才解释,在多个孩子可能属于一个共同的父元素(即使XML的层次结构并不能反映它)的情况下没有在这里处理。但是,根据OP的要求,输出在一行上:
@echo off
setlocal enabledelayedexpansion
set req_tags=SN SP UUID MACADDR cUUID
set inFile="C:\tests\xmltocsv.txt"
set outFile="C:\tests\output.csv"
if exist %outFile% del %outFile%
rem set the header line
set hLine=
for %%a in (%req_tags%) do (
set hLine=!hLine!,%%a
)
call :outputlinetocsv "%hLine%"
rem add values to file
set csvLine=
for %%a in (%req_tags%) do (
set sTag=%%a
for /F "tokens=2 delims=<>" %%f in ('findstr /I /L "^</!sTag!" %inFile%') do (
set line=%%f
set "line=!line:*>=!"
set csvLine=!csvLine!,!line!
)
)
call :outputlinetocsv "%csvLine%"
goto :eof
:outputlinetocsv
REM remove starting comma
set myLine=%~1
set "myLine=!myLine:*,=!"
echo !myLine! >> %outFile%
goto :eof
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句