Search code examples
apibatch-filefor-loopfindstr

Batch - For and Findstr with multiple criteria printed on same line


I am trying to parse some xml files and extract some data. The data pertains to the Magic The Gathering card game card data from an API. The results when I search for a card (Goblin Warchief in this example) look like this:

<?xml version="1.0" encoding="utf-8"?>
<response>
  <product>
    <idProduct>1090</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Scourge/Goblin-Warchief</website>
    <image>./img/items/1/SCG/1090.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>97</number>
    <rarity>Uncommon</rarity>
    <expansionName>Scourge</expansionName>
    <expansionIcon>41</expansionIcon>
    <countArticles>1524</countArticles>
    <countFoils>41</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/1090</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>15846</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief (Version 1)</enName>
    <locName>Goblin Warchief (Version 1)</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Friday+Night+Magic+Promos/Goblin-Warchief-Version-1</website>
    <image>./img/items/1/FNM/15846.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>2006-05</number>
    <rarity>Rare</rarity>
    <expansionName>Friday Night Magic Promos</expansionName>
    <expansionIcon>69</expansionIcon>
    <countArticles>234</countArticles>
    <countFoils>213</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/15846</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>288444</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief (Version 2)</enName>
    <locName>Goblin Warchief (Version 2)</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Friday+Night+Magic+Promos/Goblin-Warchief-Version-2</website>
    <image>./img/items/1/FNM/288444.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>2016-05</number>
    <rarity>Rare</rarity>
    <expansionName>Friday Night Magic Promos</expansionName>
    <expansionIcon>69</expansionIcon>
    <countArticles>1425</countArticles>
    <countFoils>1425</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/288444</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>18797</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Duel+Decks%3A+Elves+vs.+Goblins/Goblin-Warchief</website>
    <image>./img/items/1/EVG/18797.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>42</number>
    <rarity>Uncommon</rarity>
    <expansionName>Duel Decks: Elves vs. Goblins</expansionName>
    <expansionIcon>88</expansionIcon>
    <countArticles>254</countArticles>
    <countFoils>0</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/18797</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>249281</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/WCD+2003%3A+Wolfgang+Eder/Goblin-Warchief</website>
    <image>./img/items/1/WCD34/249281.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number></number>
    <rarity>Special</rarity>
    <expansionName>WCD 2003: Wolfgang Eder</expansionName>
    <expansionIcon>87</expansionIcon>
    <countArticles>35</countArticles>
    <countFoils>0</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/249281</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>268812</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Duel+Decks%3A+Speed+vs.+Cunning/Goblin-Warchief</website>
    <image>./img/items/1/DDN/268812.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>9</number>
    <rarity>Uncommon</rarity>
    <expansionName>Duel Decks: Speed vs. Cunning</expansionName>
    <expansionIcon>256</expansionIcon>
    <countArticles>1198</countArticles>
    <countFoils>0</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/268812</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>270006</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Duel+Decks%3A+Anthology/Goblin-Warchief</website>
    <image>./img/items/1/DD3/270006.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>2042</number>
    <rarity>Uncommon</rarity>
    <expansionName>Duel Decks: Anthology</expansionName>
    <expansionIcon>259</expansionIcon>
    <countArticles>230</countArticles>
    <countFoils>0</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/270006</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>319794</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Dominaria/Goblin-Warchief</website>
    <image>./img/items/1/DOM/319794.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>130</number>
    <rarity>Uncommon</rarity>
    <expansionName>Dominaria</expansionName>
    <expansionIcon>419</expansionIcon>
    <countArticles>7370</countArticles>
    <countFoils>221</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/319794</href>
      <method>GET</method>
    </links>
  </product>
  <links>
    <rel>self</rel>
    <href>/products/find?search=Goblin%20Warchief&amp;exact=true&amp;idGame=1&amp;idLanguage=1</href>
    <method>GET</method>
  </links>
</response>

So, as you can see, there are often multiple results for any given card search.

Now, what I am interested in doing is printing to a seperate file the and fields for each product, on the same line. So like this:

Goblin Warchief_Scourge
Goblin Warchief (Version 1)_Friday Night Magic Promos
Goblin Warchief (Version 2)_Friday Night Magic Promos
etc

I'd prefer to do this in batch, and the best I have managed to do so far is to simply print the enName and expansionName fields separately, with this:

@echo off

if exist searchResultFiltered.xml del searchResultFiltered.xml

rem The card name is passed in from the command line
set cardname=%~1

rem This uses an outside application to interface the API
mkm get "products/find?search=%cardname%&exact=true&idGame=1&idLanguage=1" > searchResult.xml

for /f "tokens=3 delims=<>" %%j in ('findstr "enName expansionName" "searchResult.xml"') do >> searchResultFiltered.xml echo %%j

This gives the output like this:

Goblin Warchief
Scourge
Goblin Warchief (Version 1)
Friday Night Magic Promos
Goblin Warchief (Version 2)
Friday Night Magic Promos
etc...

Can anyone help me get the line "pairs" onto the same line with a delimiter in-between please? I'd appreciate any help. I don't know if there's a way of doing it neatly with for and findstr, or if I need to print them to a new file or something.

Thanks!


Solution

  •  set "flag="
     for /f "tokens=3 delims=<>" %%j in ('findstr "enName expansionName" "searchResult.xml"') do (
     if defined flag (
      >> searchResultFiltered.xml call echo %%flag%% %%j&set "flag="
     ) else (set "flag=%%j")
     )
    

    flag is initialised to nothing.

    The first item passing the findstr filter sees flag as not-defined, so sets (and hence defines) flag to the required text.

    The next item through the gate now sees flag as defined hence echoes its value + the current line's value in a subshell; then clears flag.

    Rinse and repeat.

    For examples about the call echo %%var%% method to display the current value of var, see many articles on SO about delayed expansion.