[OSM-dev] API 0.5 is on the way

michael J michael_j at email.de
Sat Sep 15 19:07:03 BST 2007

Hi Martijn,

Martijn van Oosterhout wrote:
>> 1) Relation definition which allows any unordered 'member', 'tag'
>> combination, that contains at least one 'member' as child node:
>> <!ELEMENT relation (tag*, member, (member | tag)*)>
> Frederik kicked me for this: he suggests that a relation needs either
> a member or a tag but not both.

Uups. The documentation is vague on this point too. We should update it 
with the final resolution.

A relation without a member?? That is probably hard to retrieve back 
from the database.

I'd like to understand the use case behind.

According to the DTD Relations may point to Relations:

<!ELEMENT relation ((tag|member)+)>
<!ATTLIST relation id        CDATA #REQUIRED>

<!ATTLIST member type (way|node|relation) #REQUIRED>

This might lead to "Circular referenced Relations". A set of relations 
pointing to each other and that have no references to a way or a node.

Independently from the issue above I have below an example, how the DTD
could be extended to cover the complete structure of the payload too.
It also help defining the "Advanced Object Access Methods".

However, if used it has the draw back that we would need to introduce 
another child element node below the OSM root node. As it would require 
code changes, I am interested to hear if such code changes  are useful 
enough to get into the code basis.


<!ELEMENT osm (create|retrieve|update|delete)>

<!ELEMENT create   (node|relation|way)>
<!ELEMENT retrieve (bound?,(node|relation|way)*)>
<!ELEMENT update   ((node|relation|way)*)>
<!ELEMENT delete   (node|relation|way)>

<!ELEMENT osm (
| create_way
| create_relation

| retrieve_node
| retrieve_way
| retrieve_relation
| retrieve_bounding_box

| update_node
| update_way
| update_relation

| delete_node
| delete_way
| delete_relation)>

<!ELEMENT create_node              node>
<!ELEMENT create_way               way>
<!ELEMENT create_relation          relation>

<!ELEMENT retrieve_node            node>
<!ELEMENT retrieve_way             way>
<!ELEMENT retrieve_relation        relation>
<!ELEMENT retrieve_bounding_box    (bound,(node|relation|way)*)>

<!ELEMENT update_node              node>
<!ELEMENT update_way               way>
<!ELEMENT update_relation          relation>

<!ELEMENT delete_node              node>
<!ELEMENT delete_way               way>
<!ELEMENT delete_relation          relation>

+ Rest from 0.5 DTD

More information about the dev mailing list