Index: trunk/data/mappaint-style.xsd
===================================================================
--- trunk/data/mappaint-style.xsd	(revision 3612)
+++ trunk/data/mappaint-style.xsd	(revision 3612)
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://josm.openstreetmap.de/mappaint-style-1.0"
+	xmlns:tns="http://josm.openstreetmap.de/mappaint-style-1.0" elementFormDefault="qualified">
+
+	<!--
+		Localized attributes (for example de.description are not supported by
+		xsd, so root element needs <anyAttribute/>
+	-->
+
+	<element name="rules" type="tns:root"/>
+
+	<complexType name="root">
+		<sequence>
+			<choice minOccurs="0" maxOccurs="unbounded">
+				<element name="rule" type="tns:rule" />
+			</choice>
+		</sequence>
+		<attribute name="name" type="string" />
+		<attribute name="author" type="string" />
+		<attribute name="version" type="string" />
+		<attribute name="shortdescription" type="string" />
+		<attribute name="description" type="string" />
+		<attribute name="link" type="string"/>
+
+		<anyAttribute processContents="skip"/>
+	</complexType>
+
+	<!-- TODO: ensure that at least one of results exists, but only one of each element, except for linemod which may have more,
+	scale is totally optional, but each of the two may come only once -->
+	<complexType name="rule">
+		<sequence>
+			<element name="condition" type="tns:condition" minOccurs="1" maxOccurs="unbounded" />
+			<choice minOccurs="1" maxOccurs="unbounded" >
+				<group ref="tns:results" />
+				<group ref="tns:scale" />
+			</choice>
+		</sequence>
+	</complexType>
+
+	<group name="results">
+		<choice>
+			<element name="icon" type="tns:icon" />
+			<element name="area" type="tns:area" />
+			<element name="line" type="tns:line" />
+			<element name="linemod" type="tns:linemod" maxOccurs="unbounded" />
+		</choice>
+	</group>
+
+	<group name="scale">
+		<choice>
+			<element name="scale_min" type="integer" />
+			<element name="scale_max" type="integer" />
+		</choice>
+	</group>
+
+	<complexType name="condition">
+		<!-- TODO restrict to k, k+v or k+b, other attribute combinations are illegal -->
+		<attribute name="k" type="string" use="required" />
+		<attribute name="v" type="string" />
+		<attribute name="b" type="tns:yesno" />
+	</complexType>
+
+	<complexType name="icon">
+		<attribute name="src" type="string" use="required" />
+		<attribute name="annotate" type="boolean" />
+		<attribute name="priority" type="integer" />
+	</complexType>
+
+	<complexType name="line">
+		<attribute name="width" type="integer" />
+		<attribute name="dashed" type="tns:dashed" />
+		<attribute name="realwidth" type="integer" />
+		<attribute name="colour" type="tns:color" />
+		<attribute name="dashedcolour" type="tns:color" />
+		<attribute name="priority" type="integer" />
+	</complexType>
+
+	<complexType name="area">
+		<attribute name="colour" type="tns:color" />
+		<attribute name="closed" type="boolean" />
+		<attribute name="priority" type="integer" />
+	</complexType>
+
+	<complexType name="linemod">
+		<attribute name="dashed" type="tns:dashed" />
+		<attribute name="realwidth" type="integer" />
+		<attribute name="colour" type="tns:color" />
+		<attribute name="dashedcolour" type="tns:color" />
+		<attribute name="mode" type="tns:modifier_mode" use="required" />
+		<attribute name="width" type="tns:width" />
+	</complexType>
+
+	<simpleType name="yesno">
+		<restriction base="string">
+			<enumeration value="yes"/>
+			<enumeration value="no"/>
+		</restriction>
+	</simpleType>
+
+	<simpleType name="dashed">
+		<restriction base="string">
+			<pattern value="\d+(,\d+)*"/>
+			<pattern value="(true|false)"/>
+		</restriction>
+	</simpleType>
+
+	<simpleType name="modifier_mode">
+		<restriction base="string">
+			<enumeration value="under"/>
+			<enumeration value="over"/>
+		</restriction>
+	</simpleType>
+
+	<simpleType name="color">
+		<restriction base="string">
+			<pattern value="([a-z_]+#)?[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?"/>
+			<!-- name#color or color only, where color is 6 or 8 hex digits -->
+		</restriction>
+	</simpleType>
+
+	<simpleType name="width">
+		<restriction base="string">
+			<pattern value="\d+"/>
+			<pattern value="[+-]\d+"/>
+			<pattern value="\d+%"/>
+		</restriction>
+	</simpleType>
+</schema>
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(revision 3611)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(revision 3612)
@@ -6,4 +6,5 @@
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.util.Collection;
 import java.util.Collections;
@@ -16,8 +17,7 @@
 import org.openstreetmap.josm.io.MirroredInputStream;
 import org.openstreetmap.josm.tools.ImageProvider;
-import org.xml.sax.InputSource;
+import org.openstreetmap.josm.tools.XmlObjectParser;
 import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
+import org.xml.sax.SAXParseException;
 
 public class MapPaintStyles {
@@ -86,22 +86,27 @@
                     a = new String[] { null, file };
                 }
-                XMLReader xmlReader = XMLReaderFactory.createXMLReader();
-                ElemStyleHandler handler = new ElemStyleHandler(a[0]);
-                xmlReader.setContentHandler(handler);
-                xmlReader.setErrorHandler(handler);
+                XmlObjectParser parser = new XmlObjectParser(new ElemStyleHandler(a[0]));
                 MirroredInputStream in = new MirroredInputStream(a[1]);
                 InputStream zip = in.getZipEntry("xml","style");
+                InputStreamReader ins;
                 if(zip != null)
                 {
                     zipIcons = in.getFile();
-                    xmlReader.parse(new InputSource(zip));
+                    ins = new InputStreamReader(zip);
                 } else {
-                    xmlReader.parse(new InputSource(in));
+                    ins = new InputStreamReader(in);
+                }
+                parser.startWithValidation(ins, "http://josm.openstreetmap.de/mappaint-styöe-1.0",
+                "resource://data/mappaint-style.xsd");
+                while(parser.hasNext()) {
                 }
             } catch(IOException e) {
                 System.err.println(tr("Warning: failed to load Mappaint styles from ''{0}''. Exception was: {1}", a[1], e.toString()));
                 e.printStackTrace();
+            } catch(SAXParseException e) {
+                System.err.println(tr("Warning: failed to parse Mappaint styles from ''{0}''. Error was: [{1}:{2}] {3}", a[1], e.getLineNumber(), e.getColumnNumber(), e.getMessage()));
+                e.printStackTrace();
             } catch(SAXException e) {
-                System.err.println(tr("Warning: failed to parse Mappaint styles from ''{0}''. Exception was: {1}", a[1], e.toString()));
+                System.err.println(tr("Warning: failed to parse Mappaint styles from ''{0}''. Error was: {1}", a[1], e.getMessage()));
                 e.printStackTrace();
             }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 3611)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 3612)
@@ -40,5 +40,4 @@
 import javax.swing.JTextField;
 import javax.swing.SwingUtilities;
-import javax.xml.transform.stream.StreamSource;
 
 import org.openstreetmap.josm.Main;
@@ -749,5 +748,5 @@
 
         if (validate) {
-            parser.startWithValidation(in, "http://josm.openstreetmap.de/tagging-preset-1.0", new StreamSource(TaggingPreset.class.getResourceAsStream("/data/tagging-preset.xsd")));
+            parser.startWithValidation(in, "http://josm.openstreetmap.de/tagging-preset-1.0", "resource://data/tagging-preset.xsd");
         } else {
             parser.start(in);
Index: trunk/src/org/openstreetmap/josm/tools/XmlObjectParser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/XmlObjectParser.java	(revision 3611)
+++ trunk/src/org/openstreetmap/josm/tools/XmlObjectParser.java	(revision 3612)
@@ -5,4 +5,5 @@
 
 import java.io.Reader;
+import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -19,7 +20,10 @@
 import javax.xml.parsers.SAXParserFactory;
 import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
 import javax.xml.validation.Schema;
 import javax.xml.validation.SchemaFactory;
 import javax.xml.validation.ValidatorHandler;
+
+import org.openstreetmap.josm.io.MirroredInputStream;
 
 import org.xml.sax.Attributes;
@@ -276,5 +280,5 @@
 
     private Map<String, Entry> mapping = new HashMap<String, Entry>();
-    private Parser parser;
+    private DefaultHandler parser;
 
     /**
@@ -297,4 +301,8 @@
     public XmlObjectParser() {
         parser = new Parser();
+    }
+
+    public XmlObjectParser(DefaultHandler handler) {
+        parser = handler;
     }
 
@@ -328,15 +336,18 @@
     }
 
-    public Iterable<Object> startWithValidation(final Reader in, String namespace, Source schemaSource) throws SAXException {
-        SchemaFactory factory =  SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
-        Schema schema = factory.newSchema(schemaSource);
-        ValidatorHandler validator = schema.newValidatorHandler();
-        validator.setContentHandler(parser);
-        validator.setErrorHandler(parser);
-
-        AddNamespaceFilter filter = new AddNamespaceFilter(namespace);
-        filter.setContentHandler(validator);
-
-        return start(in, filter);
+    public Iterable<Object> startWithValidation(final Reader in, String namespace, String schemaSource) throws SAXException {
+        try {
+            SchemaFactory factory =  SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
+            Schema schema = factory.newSchema(new StreamSource(new MirroredInputStream(schemaSource)));
+            ValidatorHandler validator = schema.newValidatorHandler();
+            validator.setContentHandler(parser);
+            validator.setErrorHandler(parser);
+
+            AddNamespaceFilter filter = new AddNamespaceFilter(namespace);
+            filter.setContentHandler(validator);
+            return start(in, filter);
+        } catch(IOException e) {
+            throw new SAXException(tr("Failed to load XML schema."), e);
+        }
     }
 
Index: trunk/styles/maxspeed/elemstyles.xml
===================================================================
--- trunk/styles/maxspeed/elemstyles.xml	(revision 3611)
+++ trunk/styles/maxspeed/elemstyles.xml	(revision 3612)
@@ -1,4 +1,5 @@
-
-<rules>
+<?xml version="1.0" encoding="UTF-8"?>
+<rules xmlns="http://josm.openstreetmap.de/mappaint-style-1.0"
+       name="standard">
 
 	<rule>
Index: trunk/styles/standard/elemstyles.xml
===================================================================
--- trunk/styles/standard/elemstyles.xml	(revision 3611)
+++ trunk/styles/standard/elemstyles.xml	(revision 3612)
@@ -1,2 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rules xmlns="http://josm.openstreetmap.de/mappaint-style-1.0"
+       name="standard">
 <!--
 A little help:
@@ -70,6 +73,4 @@
 -->
 
-<rules name="standard">
-
 	<rule>
 		<condition k="restriction" v="no_left_turn"/>
Index: trunk/styles/standard/elemstyles_gb.xml
===================================================================
--- trunk/styles/standard/elemstyles_gb.xml	(revision 3611)
+++ trunk/styles/standard/elemstyles_gb.xml	(revision 3612)
@@ -1,2 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rules xmlns="http://josm.openstreetmap.de/mappaint-style-1.0"
+       name="standard" author="Ulf Lamping" version="1.0" shortdescription="British map overlay"
+       description="Special rules to take differences in the british area into account (e.g. traffic signs).">
 <!--
  GB specific rules
@@ -8,6 +12,4 @@
 -->
 
-<rules name="standard" author="Ulf Lamping" version="1.0" shortdescription="British map overlay"
-	description="Special rules to take differences in the british area into account (e.g. traffic signs).">
 	<rule>
 		<condition k="restriction" v="no_left_turn"/>
