ajp
ajp

Reputation: 1490

Parse XML file for attribute from batch file

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!
))

Upvotes: 5

Views: 13358

Answers (3)

npocmaka
npocmaka

Reputation: 57252

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%

Upvotes: 5

Magoo
Magoo

Reputation: 79983

@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.

Upvotes: 2

Endoro
Endoro

Reputation: 37569

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

Upvotes: 5

Related Questions