[racket] New users, XML, and xml/path
I noticed a recent IRC exchange where someone was frustrated with
se-path*/list, and felt it didn't help enough compared to Python's
standard lib for this.[^1] They were trying to get the <row> elements
from an API like this[^2]:
<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="2">
<currentTime>2011-09-10 14:41:29</currentTime>
<result>
<key accessMask="59760264" type="Character" expires="2011-09-11 00:00:00">
<rowset name="characters" key="characterID"
columns="characterID,characterName,corporationID,corporationName">
<row characterID="898901870" characterName="Desmont McCallock"
corporationID="1000009" corporationName="Caldari Provisions" />
</rowset>
</key>
</result>
<cachedUntil>2011-09-10 14:46:29</cachedUntil>
</eveapi>
Now, in the past I've dealt with XML by hand-coding, e.g. using
`match`. Which has worked fine for me. But I'd never really noticed
xml/path (was it added recently??) so I sat down to try it. Maybe I
should use that more. But a few things I noticed:
1. Name: Why the * in `se-path*` and `se-path*/list` names? By
convention this made me look for the non-* versions of these, which I
couldn't find.
2. Whitespace: When I try `(se-path*/list '(rowset) xe)` I get
'("\n " (row ((characterID "898901870") (characterName "Desmont
McCallock") (corporationID "1000009") (corporationName "Caldari
Provisions"))) "\n ")
Even with collapse-whitespace parameter set #t, I get
'(" " (row ((characterID "898901870") (characterName "Desmont
McCallock") (corporationID "1000009") (corporationName "Caldari
Provisions"))) " ")
I understand why, and what to do about it. But I'm not sure about a
new user. Probably I would instead try the following...
3. Can't get elements with their attributes: If I try `(se-path*/list
'(rows) xe)` I get back '(). Huh. I guess that's because the <row>
elements have empty bodies -- the interesting stuff is in their
attributes. OK, but I don't see how to get the element with attributes
conveniently, using xml/path.
Although I'm not very familiar with XPath, I think there probably is a
role for something simpler than it, provided with Racket itself, and
xml/path is a good idea. Does it make sense to enhance it just a bit
more, though?
p.s. If the original author of xml/path can't or doesn't want to do
this, I'd volunteer to take a shot and create a pull request. However
I know so little about XPath, I'm not sure whether that makes me the
best or worst person to be doing this (I'm mostly not joking).
[1]: http://docs.python.org/2/library/xml.etree.elementtree.html
[2]: http://wiki.eve-id.net/APIv2_Account_APIKeyInfo_XML