2017-02-07 2 views
0

Я пытаюсь извлечь значения для test_count, test_fail_count, test_pass_count из файла XML. Этот XML-файл имеет только одну очень длинную строку:Как извлечь значения из файла 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 
+0

'любые мысли о том, как отлаживать это?' - превратить 'echo on' – Stephan

+0

автономный он преуспел, btu включил его, что позволяет вам более или менее искать. Для получения дополнительной информации попробуйте выяснить и описать, что на самом деле происходит, какое поведение вы видите, какие ошибки, неожиданный вывод и т. Д. – GolezTrol

+0

Не делая точно такой же, как и для проверки, код, который вы опубликовали, представляется допустимым рабочим кодом. В вашем вопросе говорится, что включение этого кода в ваш существующий код является проблемой. Поэтому нам необходимо увидеть, что код включен. Мы не можем отлаживать код, который мы не видели. – Compo

ответ

0

попробовать xpath.bat - он может извлекать значения из XML-файлов с помощью выражения XPath и не требует установки внешних инструментов:

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

Как и в метаданных указывается, что файл должен быть utf-8 вас может проверять кодировки файлов на обеих машинах.

+0

Поскольку у OP уже был рабочий сценарий, и включение было неудачным, я не уверен, что этот практически единственный ответ на другой инструмент поможет многим. – GolezTrol

0

Причина не больше рабочего кода в командной строке

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

Существует пробел после знака равенства, что приводит к расщеплению линии чтения из XML файла на несколько маркеров с помощью символа пробела как разделитель. Поэтому вместо того, чтобы получить полное содержимое XML-файла, назначенное переменной цикла a, только строка с первым символом пробела назначается переменной цикла. По этой причине переменная окружения xmlline получает только <?xml вместо всей строки, считанной из файла XML.

Измените строку на

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

Там нет места после знака равенства, но между usebackq и delims=.

Или используйте командную строку ниже, как Magoo, размещенную в его ответе, без пробела после знака равенства, но также нет пробела между двумя опциями usebackq и delims=.

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

Маг объясняется в his comment также, почему пробел между этими двумя вариантами usebackq и delims= не является необходимым, но я предлагаю, чтобы добавить для облегчения чтения параметров.

usebackq приводит к интерпретации имени файла, заключенного в двойные кавычки, в качестве имени файла, а не как строки для разделения на токены.

delims= без символов, указанных после знака равенства, отключает разделение по умолчанию строки, считанной из файла на пробелах и горизонтальных вкладках.

Откройте окно командной строки, запустите for /? и прочитайте справку по выходным страницам справки по адресу for /F и его опциям.

Смежные вопросы