2016-04-12 8 views
2

Ich versuche, meine XML gegen eine XSD zu validieren, die in einer anderen XSD importiert wird.Nicht validieren gegen importierte XSD

haben Sie einen Blick auf den folgenden Code:

xml1.xml:

<e1 xmlns="n1" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="n2 main.xsd"> 
</e1> 

xsd1.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="n1" 
     elementFormDefault="qualified"> 
<xsd:element name="e1"/> 
</xsd:schema> 

main.xsd:

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

<xsd:import namespace = "n1" schemaLocation = "xsd1.xsd"/> 
</xsd:schema> 

Validieren xml1.xml (in Netbeans mit XML-Tools oder in Java) einfach wirft:

cvc-elt.1: Cannot find the declaration of element 'e1'. [3] 

Was könnte das Problem sein?

Antwort

2

Ihr Modell xsi:schemaLocation erfordert eine Anpassung. Es ist keine Include-Anweisung, die automatisch XSDs in den Geltungsbereich bringt; Es ist ein Hinweis, der für einen bestimmten Namespace angibt, wo die Validierung in der Lage sein könnte, eine geeignete XSD zu finden.

Wenn Sie erklären, xsi:schemaLocation="n2 main.xsd", Sie Hinting für den n2 Namespace in main.xsd zu sehen, aber Sie haben gesagt, nichts über den n1 Namespace mit dem Wurzelelement zugeordnet ist eigentlich. Validation trifft das Wurzelelement im n1 Namespace, Ihre Hinweise berät, findet nichts, und lassen Sie uns wissen:

cvc-elt.1: Cannot find the declaration of element 'e1'. [3] 

wie es sollte. Ihr Weg nach vorn ist klar: hinzufügen einen Hinweis für den n1 Namespace des Wurzelelement:

xsi:schemaLocation="n2 main.xsd n1 xsd1.xsd" 

und Ihr XML-Dokument erfolgreich validiert werden.

+0

Vielen Dank! BTW Ich erwartete, dass, weil ich das xsd1-Schema in das Hauptschema importierte, es genug ist, nur auf das Haupt zu verweisen, da es den importierten Namespace enthält. Ich beginne zu erkennen, dass es auf diese Weise nicht funktioniert, aber ich muss den importierten Namespace an ein Präfix binden und im Hauptschema verwenden. Außerdem bin ich mir sicher, dass deine Antwort gut war, nochmals vielen Dank! – user1856926

Verwandte Themen