# XSD Problem



## CelikBlek (3. Mrz 2006)

Hallo,

ich habe einen Problem in meiner XSD Datei. Hier erstmal Ausgangssituation.
Ich habe eine XML-Datei, die ich mit einer XSD validiere. Ich habe zur Erstellung den XML SPY benutzt und funktioniert auch so weit bis auf ein Paar Einschränkungen. 
Ich parse die XML über den SAXBuilder in Java. Es meckert auch wenn was nicht passt nur bei einem Punkt nicht. Wenn es die erlaubte Länge überschreitet.

```
<xs: simpleType name="">
   <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{2, 10}">
   </xs:restriction>
</xssimpleType>
```
Was bedeuten würde min. 2 Zeichen und max. 10. Nun wenn der Eintrag unter 2 ist meckert er aber bei max. nicht. Warum? Ausserhalb von Java funzt es (XMLSpy). Woran kann es liegen?

Und ein zweiter Problem. Es funktioniert der default Konstrukt für Attribute nicht.

```
<xs:attribute name="partner" default="Herr Hase"/>
```
Was bedeutet wenn der Attribute leer ist, dann soll es mit Herr Hase gefüllt werden.

Wäre froh, wenn jemand helfen kann. Vielen Dank.
Gruss


----------



## byte (3. Mrz 2006)

Entferne mal das Leerzeichen, also:


```
<xs:pattern value="[0-9]{2,10}">
```

Wegen des zweiten Punkts: Was funktioniert daran denn nicht?


----------



## CelikBlek (3. Mrz 2006)

byto hat gesagt.:
			
		

> Entferne mal das Leerzeichen, also:
> 
> 
> ```
> ...


Tut mir leid mein Fehler. In meiner XSD ist es ohne Leerzeichen. Von Syntax her funktioniert es ja auch. Selbst über XMLSpy funktioniert es. -> Wenn ich etwas eingebe der 11 Zeichen hat, dann meckert er. Nur in mein SAXBuilder in Java sag, dass die Datei valid ist. Komischerweise meckert er, wenn es weniger als 2 Zeichen hat  :bahnhof: 



> Wegen des zweiten Punkts: Was funktioniert daran denn nicht?


Die XSD soll mir die XML, der geliefet wird mit den default Wert füllen, wenn es leer ist.

```
<myelement partner="">Text</myelement>
```
Also wenn der Attribut partner leer ist, dann soll XSD mir den default Wert füllen. Hier ein Link zu.
www.w3schools.com/schema/schema_simple_attributes.asp


----------



## byte (3. Mrz 2006)

Hm komisch. Hatte nie Probleme, aber hab auch Apache Xerces zum Validieren verwendet. Vielleicht solltest Du auch mal den Parser wechseln, wenns mit XMLSpy klappt und mit JAXP nicht.


----------



## CelikBlek (3. Mrz 2006)

Hast du auch schonmal den default Wert für einen Attribut erfolgreich benutzt?


----------



## byte (3. Mrz 2006)

Ne, aber es kommt mir auch spanisch vor, dass der Validierer da etwas am XML-Dokument ändern soll. Denn ansich prüft der ja nur die Struktur der XML-Datei und sagt dann entweder ja oder nö. Wäre mir neu, wenn der auch automatisch Attribute mit Default-Werten füllt.


----------



## CelikBlek (3. Mrz 2006)

Ja den xerces habe ich mal probiert, aber hatte da irgendwelche syntax probleme. hast zufällig stück code beispiel? Also zur Zeit lese ich den Pfad für die XSD aus den Properties und das würde ich auch gerne beibehalten, wenn es denn irgendwie geht.


----------



## CelikBlek (3. Mrz 2006)

byto hat gesagt.:
			
		

> Ne, aber es kommt mir auch spanisch vor, dass der Validierer da etwas am XML-Dokument ändern soll. Denn ansich prüft der ja nur die Struktur der XML-Datei und sagt dann entweder ja oder nö. Wäre mir neu, wenn der auch automatisch Attribute mit Default-Werten füllt.


Ok da gebe ich dir recht. Aber schau doch mal den Link von oben bitte an. Wofür ist es denn sonst gut? Es gibt auch eine fixed Variante.


----------



## byte (3. Mrz 2006)

Hab das mal nachgeschlagen in der offiziellen XML-Schema Spezifikation:



			
				http://www.w3.org/TR/xmlschema-0 hat gesagt.:
			
		

> Default values of both attributes and elements are declared using the default attribute, although this attribute has a slightly different consequence in each case. When an attribute is declared with a default value, the value of the attribute is whatever value appears as the attribute's value in an instance document; if the attribute does not appear in the instance document, the schema processor provides the attribute with a value equal to that of the default attribute. Note that default values for attributes only make sense if the attributes themselves are optional, and so it is an error to specify both a default value and anything other than a value of optional for use.



Demnach stimmt es, was bei W3Schools steht. Ich nehme einfach an, dass der von Dir verwendete SAXBuilder die Spezifikation nicht 100%ig umsetzt. Du kannst mal versuchen, zusätzlich use="optional" hinzuzufügen. Ist zwar ansich unsinnig, weil Attribute ja per Default optional sind, aber vielleicht funktionierts ja dann.

Komisch kommts mir aber trotzdem noch vor, dass Validierer schreibend auf ein XML-Dokument zugreifen sollen...


----------



## CelikBlek (3. Mrz 2006)

Werde es mal gleich probieren. Hast du zufällig gerade die Validierung für XSD mit XERCES parat?


----------



## byte (3. Mrz 2006)

Bin grad nich an meinem Rechner, aber bei Xerces dürfte entsprechender Beispielcode dabei sein.


----------



## CelikBlek (5. Mrz 2006)

Also habe da nochmal eine Frage. Ich möchte gerne die XSD-Pfad aus dem Properties lesen und dem Parser mitgeben. Funktioniert das so?

```
DOMParser parse = new DOMParser();
		String VAL_ID = "http://xml.org/sax/features/validation";
		String S_VAL_ID = "http://apache.org/xml/features/validation/schema";
		try {
			String xsd_pfad = ConfigLoader.getTheInstance().getProperty("xsd_pfad");
			parse.setProperty("http://apache.org/xml/properties/schema/" +
					"external-noNamespaceSchemaLocation", xsd_pfad);
			parse.setFeature(VAL_ID, true);
			parse.setFeature(S_VAL_ID, true);
		} catch (SAXException e) {
			System.err.println("could not set parser feature");
		}
```


----------



## byte (5. Mrz 2006)

Du musst dabei darauf achten, dass der Pfad zu XSD ne URI (als String) ist. Also wenn die Datei z.B. auf der eigenen Platte liegt, dann mit file:... und Sonderzeichen (z.B. Leerzeichen) müssen entsprechend ersetzt sein.


----------



## CelikBlek (5. Mrz 2006)

ich verstehe das nicht. Er findet ja die richtige XSD. Sonst würde es ja nicht beim minimum  Grenze reagieren. Wie gesagt bei{2,10} funktioniert es wenn es unter 2 Zeichen besitzt, aber bei max. Grenze 10 nicht. 
Wie kann denn sowas sein? Ich kriege noch einen rappel...
Diese zwei Probleme habe ich immer noch. Ich gebe mal den wirklichen Code:

```
<xs:attribute name="ansprechpartner" type="ansprechpartner_type" default="Herr Meier"/>
...
<xs:simpleType name="ansprechpartner_type">
   <xs:restriction base="xs:string">
      <xs:maxLength value="30"/>
   </xs:restriction>
</xs:simpleType>



<xs:simpleType name="nr_type">
   <xs:restriction base="xs:string">
	<xs:pattern value="[0-9]{1,10}"/>
   </xs:restriction>
</xs:simpleType>
```

und das Parsing in Java (SAX Variante):

```
SAXBuilder m_SAXBuilder = new SAXBuilder(true);
m_SAXBuilder.setFeature("http://apache.org/xml/features/validation/schema", true);
String xsd_pfad = ConfigLoader.getTheInstance().getProperty("xsd_pfad");
m_SAXBuilder.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", xsd_pfad);
```

Woran liegt es?


----------



## CelikBlek (6. Mrz 2006)

So habe die Antwort darauf gefunden. 
1. default Werte werden nur dann erzeugt, wenn das Attribut wirklich *nicht *existiert. Also nicht nur

```
<myElement attr=""/>
```
Da würde er keinen Wert einsetzen.

2. Ich habe die maximal Grenze durch einen anderen Element-Typ abgelöst. Also statt xs:string habe ich nun xs:integer mit minInclusive="1" und maxInclusive"1234567890" genommen. Ist zwar nicht die Lösung, aber so gehts auch.

Also vielen Dank erstmal.


----------



## byte (6. Mrz 2006)

Es freut mich, dass Du die Probleme für Dich lösen konntest. Immer wieder interessant zu sehen, wie wenig Leute sich doch mit XML-Schema zu beschäftigen scheinen. Es scheint echt immernoch nicht sehr weit verbreitet zu sein, in Anbetracht der Tatsache, wie wenig Leute auf Schema-Fragen antworten. Dabei gibts die Empfehlung nun schon seit ~5 Jahren und XML-Schema ist IMO wirklich so viel besser als DTD. :roll:


----------



## CelikBlek (6. Mrz 2006)

Ich will mich nochmal bei dir direkt bedanken 
Leider habe ich zwar keine antwort gefunden, warum Angabe der Obergrenze nicht funktioniert, aber Problem erstmal anders gelöst. ???:L 
Vielleicht taucht ja jemand auf und hat eine bessere Lösung.


----------

