Here's an example procedure call from the spec, minus headers:

Code:
<?xml version="1.0"?>
<methodCall>
   <methodName>examples.getStateName</methodName>
   <params>
      <param>
         <value><i4>41</i4></value>
         </param>
      </params>
   </methodCall>
Why is <i4> (= 4 byte integer) not an attribute of one of its parent elements? The way I always figured this worked was that attributes expressed "is-a" relationships and sub-tags expressed "has-a" relationships. A method call has a parameters list, so the params list is ok, it has a target name or is a call to a name depending on your exact terminology, so that works either way. There isn't, however, a 4 byte integer inside the value inside the parameter: they're all aspects of the same thing. Never mind that "value" is a really poor name choice for something that means "scalar".

Am I missing some logic here? It seems to be a false hierarchy (hence the same line, no whitespace formatting, I guess) and to be unduly verbose even by XML standards, but I don't think there's a hard-and-fast rule about what should be an attribute, so maybe it's ok. I know it'll work for me either way so long as I'm consistent (I'm coding the client and the server), I'm just looking for some ideological guidance.