2009-05-27 4 views
6

Hallo Ich versuche, mich um XSDs, XML und Namespaces zu kümmern, aber ich kann Dinge nicht so funktionieren lassen, wie ich es möchte.XSD mit Imports und Namespaces

Ich habe eine XSD, die im Moment, wie dies beginnt:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.example.com"> 
    <xs:import namespace="http://www.example.com" schemaLocation="Include.xsd" /> 

Wie Sie sehen können, es importiert eine andere XSD-Datei, die wie folgt beginnt:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" 
      targetNamespace="http://www.example.com" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.example.com"> 

ich dann haben einige xML-Dokumente auf der Grundlage dieses Schema:

<foobar> 
    <whatever>.... 

Im Grunde ist es mir egal, was die Namensräume sind, ich ju Ich will, dass das verdammte Ding funktioniert. Früher habe ich keinen Namespace verwendet, aber es scheint, dass ich sie verwenden muss, um ein XSD in ein anderes zu importieren. Was ich nicht tun möchte, ist, dass ich allen Elementen in meinen XML-Dokumenten Präfixe geben muss.

Um dies zu erreichen, welche Kombination von Werten brauche ich für die verschiedenen Attribute (targetNamespace, namespace, xmlns, elementFormDefault usw.) in den XSD- und XML-Dokumenten?

Derzeit erfordern alle im importierten XSD-Dokument definierten Elemente eine Namespace-Qualifizierung im XML-Format.

+0

Gibt es in Ihrem Dokument tatsächlich beginnen mit meaninging Sie haben einen ‚xml‘ Element definiert in einem der Schemata, oder meinen Sie das Dokument mit beginnt? – Jherico

+0

Ich meinte, die Wurzel war xml - ich habe es behoben, um Verwirrung zu vermeiden. – cbp

Antwort

13

Wenn Sie keine Namespaces oder Ihre Schemata mit teilen die gleichen Namensräume, würden Sie viel besser mit xs: include anstatt xs: import. Schema A kann Schema B enthalten, wenn B entweder denselben Namespace wie A hat oder keinen Namespace deklariert hat (wenn letzteres der Fall ist, "adoptiert" B den Namespace des Includers, wenn es enthalten ist). So ... so etwas wie:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.example.com"> 
    <xs:include schemaLocation="Include.xsd" /> 

<!-- ... --> 

</xs:schema> 
+0

ahhh richtig! Vielen Dank – cbp

1

Ich würde denken, Sie müssen Ihre elementFormDefault auf "unqualifiziert" setzen, wenn Sie die Präfixe auf Ihren XML-Elementen vermeiden wollen. Der Rest sollte in Ordnung sein, denke ich - der Namespace ist der gleiche zwischen Ihrem Master und Ihrer importierten XSD - das ist in Ordnung. Sie geben das xmlns = ohne ein Präfix an - das ist in Ordnung. Du solltest gut gehen.

Marc

+0

Danke, du hast recht - ich war näher als ich dachte. Ich stelle jedoch fest, dass Elemente, die in der importierten XSD definiert sind, bei der Erstellung meines XML-Dokuments den angegebenen Namespace angeben müssen (obwohl sowohl für das importierte XSD als auch für das tatsächliche XSD elementFormDefault auf "unqualifiziert" gesetzt ist). – cbp