Trying to read XML

I'm really weak at XML. OK, given that, I'm trying to write a simple script that will read an XML-formatted file and produce a value out of it. Here is a subset of the sample XML file:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="is.xsl" ?>
<!DOCTYPE msi [
   <!ELEMENT msi   (summary,table*)>
   <!ATTLIST msi version    CDATA #REQUIRED>
<msi version="2.0" xmlns:dt="urn:schemas-microsoft-com:datatypes" codepage="65001">
    <title>Installation Database</title>
  <table name="InstallShield">
    <col key="yes" def="s72">Property</col>
    <col def="S0">Value</col>
Here is my ill-fated attempt at reading the SchemaVersion value (for which I want the end result of this batch file to set the _InstallShieldSchema variable to 774):

set _InstallShieldSchema=%@XMLXPath["Aurora.ism","//msi/table[@name='InstallShield']/SchemaVersion"]
echo SchemaVersion is %_InstallShieldSchema
When I run this, I get an error: "TCMD: (XML) Line: 3; Char: 11 DTD is prohibited."
Sep 11, 2013
I had to comment out the DOCTYPE block to get rid of the error you are seeing. Here is the script that I came up with to get what you are wanting:

Comment out the block in the XML file:

<!-- <!DOCTYPE msi [
<!ELEMENT msi (summary,table*)>
]> -->

Script code:

@echo off
SET a=%@XMLOPEN[Test.xml]
SET b=%@XMLNODES[//msi/table[@name='InstallShield']/row]
DO i = 2 to %b
SET c=%@XMLNODES[//msi/table[@name='InstallShield']/row/td]
DO j = 2 to %c
set _InstallShieldSchema=%@XMLXPath[//msi/table[@name='InstallShield']/row[%i]/td[%j]]
@echo SchemaVersion is %_InstallShieldSchema
Thank you for the attempt, Dave, but I can't remove the DOCTYPE block. It's part of the file I have to process, with no option otherwise.

OK, I solved this problem with a completely different approach. Not a very flexible solution, but it does the job. I know that SchemaVersion is unique within the file, and the format of the line where it is found doesn't change (at least not now, and not in all of the previous versions to which I have access).


setdos /x-6
set _ism=%@MaybeQuote[%@full[%@expand[*.ism]]]
rem Line containing schema looks like:
rem  <row><td>SchemaVersion</td><td>774</td></row>
set _Ver=%@execstr[*grep SchemaVersion %_ism]
set _Index=%@eval[%@index[%_Ver,/td] + 8]
echo SchemaVersion is %@instr[%_Index,3,%_ver]
setdos /x+6
rem If you want just the number, use %@word[-0,[%@execstr[getisschemaversion]]
(edited to put the * in front of grep, since I have an alias for grep to call grep in a special way, but in this instance I just want to call the regular program)
Last edited: