5

I am parsing a XML file like below:

<?xml version="1.0"?>
<!--
-->
<configuration>
   <settings>
      <connections>
            <connection name="name1" value="connection1" type="abc"/>
            <connection name="name2" value="connection2" type="def"/>
      </connections>
   </settings>
</configuration>

From the batch file, I prompt the user for connection name. I want to parse the XML get a connection with the specified name and get its value. So If user gives name1, I want to select connection1. I had the below code from Extract XML Tag Values (Based on a Flag) Using Batch

I am not familiar with for loop in (especially delimits, tokens) batch file, so I am not sure how this works and how to make it work for me.

(for /F "tokens=1,2 delims== " %%a in (connection.config) do (
   if "%%~b" neq "" set %%a=%%~b
   if /I "!name!" equ "%name%" echo !value!
))
3
  • 8
    +1 for just being insane enough to try to parse XML in a batch script. Commented Apr 23, 2013 at 16:07
  • 1
    -1 for not being sane enough to realise parsing xml in a batch script is bad idea. (only kidding) Commented Apr 23, 2013 at 16:10
  • have a look at xmlstarlet, a set of command-line utilities that will save you from severe unhappiness. Commented Apr 23, 2013 at 16:45

3 Answers 3

5

It works, if you use the right tokens and delimiters:

@echo off&setlocal
for /F tokens^=2^,3^,5delims^=^<^"^= %%a in (connection.config) do (
   if "%%a" equ "connection name" echo(%%b %%c
)

Output is:

name1 connection1
name2 connection2
Sign up to request clarification or add additional context in comments.

2 Comments

What is the purpose of escaping everything like that. Also, why isn't there a " before Tokens?
You can use double quotes to escape something or as delimiters, but not for both.
5

Here's the xpath.bat -small script that will allow you to get a xml values by xpath expression without using external binaries:

call xpath.bat "connection.config" "//connection/@name"
call xpath.bat "connection.config" "//connection/@value"

to assign this to a variable:

for /f "tokens=* delims=" %%# in ('xpath.bat "connection.config" "//connection/@value"') do set "connection_value=%%#"
echo %connection_value%

Comments

2
@ECHO OFF
SETLOCAL
SET "name=name1"
SET "connection="
SET "type="

for /F "tokens=5,7delims==/ " %%a in (
 'findstr /c:"<connection name=\"%name%\"" ^<connection.config'
 ) do SET connection=%%~a&SET type=%%~b

ECHO connection=%connection%
ECHO TYPE      =%type%

Finding the data line which contains the literal string "\" escapes ") then set connection to the 5th (and type for good measure) from the seventh token of the data line

        <connection name="name1" value="connection1" type="abc"/>

using =, / and [space] as delimiters.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.