JFYI: XSD for OSM files

Since http://wiki.openstreetmap.org/wiki/API_v0.6/XSD is outdated and not valid now, I created xsd for osm files.

I tested it by files from http://download.geofabrik.de/


<?xml version="1.0" encoding="UTF-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="osm">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="bounds" />
        <xs:element ref="node" minOccurs="0" maxOccurs="unbounded" />
        <xs:element ref="way" minOccurs="0" maxOccurs="unbounded" />
        <xs:element ref="relation" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="version" type="xs:float" use="required" fixed="0.6" />
      <xs:attribute name="generator" type="xs:string" use="optional" />
      <xs:attribute name="copyright" type="xs:string" use="optional" />
      <xs:attribute name="attribution" type="xs:string" use="optional" />
      <xs:attribute name="license" type="xs:string" use="optional" />
      <xs:attribute name="timestamp" type="xs:dateTime" use="optional" />
    </xs:complexType>
  </xs:element>

  <xs:element name="bounds">
    <xs:complexType>
      <xs:attribute name="minlat" type="Lat" use="required" />
      <xs:attribute name="minlon" type="Lon" use="required" />
      <xs:attribute name="maxlat" type="Lat" use="required" />
      <xs:attribute name="maxlon" type="Lon" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="node">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="osmBasicType">
          <xs:sequence>
            <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
          <xs:attribute name="lat" type="Lat" use="required" />
          <xs:attribute name="lon" type="Lon" use="required" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="way">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="osmBasicType">
          <xs:sequence>
            <xs:element ref="nd" minOccurs="1" maxOccurs="unbounded" />
            <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="relation">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="osmBasicType">
          <xs:sequence>
            <xs:element ref="member" minOccurs="1" maxOccurs="unbounded" />
            <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="tag">
    <xs:complexType>
      <xs:attribute name="k" type="xs:string" use="required" />
      <xs:attribute name="v" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="nd">
    <xs:complexType>
      <xs:attribute name="ref" type="ID" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="member">
    <xs:complexType>
      <xs:attribute name="type" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="way" />
            <xs:enumeration value="node" />
            <xs:enumeration value="relation" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="ref" type="ID" use="required" />
      <xs:attribute name="role" type="xs:string" use="optional" />
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="Lat">
    <xs:restriction base="xs:float">
      <xs:minInclusive value="-90" />
      <xs:maxInclusive value="90" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="Lon">
    <xs:restriction base="xs:float">
      <xs:minExclusive value="-180" />
      <xs:maxInclusive value="180" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ID">
    <xs:restriction base="xs:long">
      <xs:minInclusive value="1" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="osmBasicType">
    <xs:attribute name="id" type="ID" use="required" />
    <xs:attribute name="uid" type="xs:int" use="optional" />
    <xs:attribute name="user" type="xs:string" use="optional" />
    <xs:attribute name="timestamp" type="xs:dateTime" use="optional" />
    <xs:attribute name="changeset" type="xs:int" use="optional" />
    <xs:attribute name="version" type="xs:int" use="required" />
    <xs:attribute name="visible" type="xs:boolean" use="optional" />
  </xs:complexType>

</xs:schema>