如何从没有换行符(非常长的单行)的XML文件中提取值?

时间:2017-02-07 15:02:51

标签: batch-file

我正在尝试从XML文件中提取test_counttest_fail_counttest_pass_count的值。这个XML文件只有一个非常长的行:

<?xml version="1.0" encoding="UTF-8"?><ROOT test_count="22" test_fail_count="1" test_pass_count="21".......</ROOT>

Magoo帮我写了这个剧本,看看他在上一个问题上的回答 How to match strings from an XML file using batch and assign to variable?

此脚本最初有效。但是当我将它合并到我更大的整体脚本中时,它失败了。自从进行此修改后,我无法按预期再次使用此脚本。

有关如何调试此问题的想法吗?

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\Report.xml"
SET "testcount="
SET "testfailcount="
echo forloop
FOR /f "usebackqdelims= " %%a IN ("%filename1%") DO (
 SET "xmlline=%%a"
 CALL :process
)

ECHO test count=%testcount% test fail count=%testfailcount%

GOTO :EOF

:process
 echo in process
:: dispose of awkward characters
SET "xmlline=%xmlline:?= %"
SET "xmlline=%xmlline:>= %"
SET "xmlline=%xmlline:<= %"
CALL :select %xmlline%
GOTO :EOF

:select
echo in select
IF /i "%~1"=="" GOTO :EOF
IF DEFINED testcount IF DEFINED testfailcount GOTO :EOF
IF /i "%~1"=="test_count" SET /a testcount=%~2
IF /i "%~1"=="test_fail_count" SET /a testfailcount=%~2
SHIFT
GOTO select

GOTO :EOF

2 个答案:

答案 0 :(得分:0)

尝试xpath.bat - 它可以通过xpath表达式从xml文件中提取值,而不需要安装外部工具:

call xpath.bat "report.xml" "//ROOT/@test_count"
call xpath.bat "report.xml" "//ROOT/@test_fail_count" 

在元数据中指出文件应为utf-8,您可以检查两台机器上文件的编码。

答案 1 :(得分:0)

不再使用代码的原因在于命令行

FOR /f "usebackqdelims= " %%a IN ("%filename1%") DO (

等号后面有一个空格字符,导致使用空格字符作为分隔符将从XML文件读取的行拆分为多个标记。因此,不是将整个XML文件内容分配给循环变量a,而是将直到第一个空格字符的字符串分配给循环变量。因此,环境变量xmlline仅被分配<?xml而不是从XML文件中读取的整行。

将行更改为

FOR /f "usebackq delims=" %%a IN ("%filename1%") DO (

等号后没有空格,但usebackqdelims=之间没有空格。

或者使用下面的命令行作为他的答案中张贴的Magoo,等号后没有空格,但两个选项usebackqdelims=之间也没有空格。

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (

Magoo在his comment中解释了为什么两个选项usebackqdelims=之间的空格字符不是必需的,但我建议添加以便于阅读选项。

usebackq导致将用双引号括起来的文件名解释为文件名而不是作为字符串来解析为标记。

等号后未指定字符的

delims=禁用默认拆分从空格和水平制表符上的文件读取的行。

打开命令提示符窗口,运行for /?并阅读输出帮助页面以获取有关for /F及其选项的帮助。