# Kann sich mal bitte kurz jemand meine XSD anschauen? :-)



## Happyman0815 (11. Aug 2010)

Hallo Leute!

Ich musste das erste mal jetzt eine xsd schreiben um ein XML Dokument zu validieren. Scheinbar klappt es noch nicht ganz, daher wäre es nett, wenn mal kurz jemand einen Blick drauf werfen kann.


Hier ist meine XSD:

[XML]
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified"
            xmlns="urn:nonstandard:test" 
            targetNamespace="urn:nonstandard:test">


    <xsd:element name="ERP" type="erp" />
    <xsd:complexType name="erp">
        <xsd:all>
            <xsd:element name="ordertype" type="xsd:string" minOccurs="1" maxOccurs="1" />
            <xsd:element name="weightCost" type="xsd:string" minOccurs="1" maxOccurs="1" />
            <xsd:element name="weightDelivery" type="xsd:string" minOccurs="1" maxOccurs="1" />
            <xsd:element name="high_priority" type="xsd:string" minOccurs="1" maxOccurs="1" />
            <xsd:element name="ldr_blueprint" type="xsd:string" minOccurs="1" maxOccurs="1" />
        </xsd:all>
    </xsd:complexType>
</xsd:schema>
[/XML]


und hier ist meine XML File zu dieser XSD:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<ERP>
  <ordertype>requestOffer</ordertype>
  <weightCost>50</weightCost>
  <weightDelivery>50</weightDelivery>
  <high_priority>false</high_priority>
  <ldr_blueprint>0 Untitled
0 Name: o </ldr_blueprint>
</ERP>
[/XML]


Die XML File ist laut folgender Testfunktion:


```
boolean validateXML(String xmlString, String schemaFilePath)
	 {
		 try {
		      String schemaLang = "http://www.w3.org/2001/XMLSchema";
		      SchemaFactory factory = SchemaFactory.newInstance(schemaLang);
		      Schema schema = factory.newSchema(new StreamSource(schemaFilePath));
		      Validator validator = schema.newValidator();
		      validator.validate(new StreamSource(new StringReader(xmlString)));
		    }catch (SAXException ex) {
		    	return false; // document is not valid:
		    } catch (Exception ex) {
		      ex.printStackTrace();
		      return false;
		    }
		    return true;
	 }
```

nicht valide. Kann es sein das die XSD einen Fehler hat? 


Gruß
Happy


----------



## Wildcard (12. Aug 2010)

Die XSD schaut erstmal gut aus. Lass dir die SAXException mal ausgeben.


----------



## Happyman0815 (12. Aug 2010)

```
org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document './requestOffer.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source)
	at javax.xml.validation.SchemaFactory.newSchema(Unknown Source)
	at 
ClientRequestProcessor.validateXML(ClientRequestProcessor.java:532)
```


hmm.. könnte es sein, dass ich die XSD-File falsch übergebe? Ich mache heute aber erstmal Feierabend!

Gruß
Happy


----------



## Wildcard (12. Aug 2010)

Happyman0815 hat gesagt.:


> hmm.. könnte es sein, dass ich die XSD-File falsch übergebe? Ich mache heute aber erstmal Feierabend!


Jup, die Datei wird nicht gefunden. Fang vielleicht erstmal mit einem absoluten Pfad an, relative Pfade können tricky sein.


----------



## Happyman0815 (12. Aug 2010)

Hallo!

So nun habe ich mal den Pfad angepasst und siehe da: Nächster Fehler ;(


```
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'ERP'.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.validation.StreamValidatorHelper.validate(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(Unknown Source)
	at javax.xml.validation.Validator.validate(Unknown Source)
	at 
ClientRequestProcessor.validateXML(ClientRequestProcessor.java:534)
```

Das Element ERP ist doch vorhanden...


----------



## Happyman0815 (12. Aug 2010)

Wenn ich den XSD Header wie folgt ändere:


```
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">


    <xsd:element name="ERP" type="erp" />
    ...
</xsd:schema>
```

funktioniert es... Ist die XSD nun falsch oder macht es Sinn?


----------



## heinzHerbert (12. Aug 2010)

In deiner XSD gibst du mit targetNamespace an aus welchem Namespace die Elemente in deinem XML-Dokument kommen müssen. Je nachdem, wie du es haben möchtest musst du das korrigieren:


 Möglichkeit 1 hast du schon selbst gefunden: entfernen von 
	
	
	
	





```
targetNamespace="..."
```
 und 
	
	
	
	





```
xmlns="..."
```
 aus deiner XSD.
 Möglichkeit 2: Du gibst im XML-Dokument den Namespace mit an:

[xml]
<?xml version="1.0" encoding="UTF-8"?>
<ERP xmlns="urn:nonstandard:test">
  <ordertype>requestOffer</ordertype>
  <weightCost>50</weightCost>
  <weightDelivery>50</weightDelivery>
  <high_priority>false</high_priority>
  <ldr_blueprint>0 Untitled
0 Name: o </ldr_blueprint>
</ERP>
[/xml]


----------



## Happyman0815 (12. Aug 2010)

Ah sehr gut, Danke!

Ich bleibe dann bei Möglichkeit 1 

Gruß
Happy


----------

