## page was renamed from Parsing XML with CAD LISP
Actually this problem is not so hard. The steps to take:
* Open a file.
* Read each line with a {{{while}}} statement.
* Use {{{wcmatch}}} to get a pattern (like a tag value).
* When a {{{wcmatch}}} hit occurs:
* Use {{{vl-string-search}}} to find delimiter positions.
* Next, use {{{substr}}} to get the values between these delimiters.
The following example parses a line with two values between four comma's (longitude and latitude) and assigns a value to {{{lat}}} and {{{lon}}}:
{{{
;; str is a line from the file
(setq
posns (vl-string-search "," str (+ 1 (vl-string-search "," str))) ; Position Northing Start
posne (vl-string-search "," str (+ 1 posns)) ; Northing End
poses (vl-string-search "," str (+ 1 posne)) ; Easting Start
posee (vl-string-search "," str (+ 1 poses)) ; Easting end
lat (atof (substr str (+ posns 2) (- posne posns 1))) ; Latitude
lon (atof (substr str (+ poses 2) (- posee poses 1))) ; Longitude
)}}}
This works fine for CSV files as well. The example below uses " as delimiter...
= Pretty Printing =
This works fine for files with their XML tags on subsequent lines, i.e. pretty printed files. It becomes a problem when all data is just on one line since {{{wcmatch}}} only supports the first 500 characters.
A cat command shows this at the end at the end of a .GPX file from a Garmin device, many megabytes on one line of text:
{{{
...
-8.0-8.0-7.0-7.0}}}
As a consequence, pretty printing is needed before the file is processed.
For Linux users this is easy:
{{{
xmllint --format filename}}}
After {{{xmllint}}} it shows the following and is ready to be parsed with CAD LISP:
{{{
...
-8.0-8.0-7.0-7.0
}}}
= xmllint on Windows =
There are at least two ways for the command line (and automation):
* Install Cygwin. This will probably offer the best Linux command line experience possible. See https://en.wikipedia.org/wiki/Cygwin and https://cygwin.com/
* Use "Bash on Ubuntu on Windows", this world keeps surprising us, see for example https://www.howtogeek.com/265900/everything-you-can-do-with-windows-10s-new-bash-shell/
Several GUI solutions exist:
* "XML Copy Editor" does a good job, open a file, press F11 is all it takes. See http://xml-copy-editor.sourceforge.net/