2012-04-12 17 views
1

Ich versuchte zu verstehen, folgen Sie alle (komplizierten) Regeln der XML-Schema-Behandlung, aber ich kann immer noch nicht herausfinden! Mein Problem ist das:XML-Schema-Validierung mit leeren Namespace

  • Ich habe eine XSD;
  • Ich möchte erstellen und validieren XML-Dateien basierend auf dieser XSD, ohne ein Präfix für Elemente;
  • Ich möchte Editoren wie jEdit, Eclipse, etc. Auto-Vervollständigung basierend auf XSD behandeln.

Alle validierende Editoren geben mir jedoch die gleiche Fehlermeldung. Hier

ist eine abgespeckte Version des XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://www.megadix.org/standards/temp.xsd" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jfcm="http://www.megadix.org/standards/temp.xsd" 
elementFormDefault="unqualified" attributeFormDefault="unqualified"> 

<xsd:complexType name="MapsType"> 
    <xsd:sequence> 
     <xsd:element name="map" minOccurs="0" maxOccurs="unbounded"> 
      <xsd:complexType> 
       <xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute> 
       <xsd:sequence> 
        <xsd:element name="description" type="xsd:string" minOccurs="0" maxOccurs="1"></xsd:element> 
        <xsd:element name="concepts" minOccurs="0" maxOccurs="1"> 
         <xsd:complexType> 
          <xsd:sequence> 
           <xsd:element name="concept" minOccurs="0" maxOccurs="unbounded"> 
            <xsd:complexType> 
             <xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute> 
            </xsd:complexType> 
           </xsd:element> 
          </xsd:sequence> 
         </xsd:complexType> 
        </xsd:element> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:element name="maps" type="jfcm:MapsType"></xsd:element> 

Wenn ich einen Präfix verwenden, Dateien korrekt validieren und auto-complete:

<?xml version="1.0" encoding="UTF-8"?> 
<jfcm:maps xmlns:jfcm="http://www.megadix.org/standards/temp.xsd"> 
<map name="Test Map"> 
    <concepts> 
     <concept name="c1" /> 
     <concept name="c2" /> 
     <concept name="c3" /> 
    </concepts> 
</map> 

Aber wenn ich es entferne:

<?xml version="1.0" encoding="UTF-8"?> 
<maps xmlns:jfcm="http://www.megadix.org/standards/temp.xsd"> 
<map name="Test Map"> 
    <concepts> 
     <concept name="c1" /> 
     <concept name="c2" /> 
     <concept name="c3" /> 
    </concepts> 
</map> 

Ich bekomme diese Fehlermeldung:

ungültiger Inhalt gefunden wurde mit dem Element 'Karte' zu starten. Eine von {map} wird erwartet.

Irgendwelche Vorschläge?

Antwort

3

Da Sie „unqualifiziert“ für das Element des Formulars verwenden, dies ist der richtige Weg, es zu tun:

<?xml version="1.0" encoding="UTF-8"?> 
<maps xmlns="http://www.megadix.org/standards/temp.xsd"> 
    <map name="Test Map" xmlns=""> 
    <concepts> 
     <concept name="c1" /> 
     <concept name="c2" /> 
     <concept name="c3" /> 
    </concepts> 
    </map> 
</maps> 

Wenn Sie alle Elemente wollen „Share“ auf dem Namensraum, haben Sie ElementFormDefault- definieren = "qualifiziert"; Als eine Seitenleiste würden viele XSD-Designer dies als einen guten Rat betrachten.

+0

Ich bin nicht sicher, ob die angegebene XML gültig ist. Weil Ihr Ziel-Namespace sich auf einen der spezifischen Namespaces beziehen sollte, die für den Kontext definiert sind. – Phani

+0

@Phani, ich kann Ihnen versichern, dass es basierend auf der XSD (na ja, ich musste das Attribut nach der Sequenz verschieben, aber das ist irrelevant für unser Problem hier). Eine Sache, an die Sie denken müssen, ist, dass ein Dokumentelement (oder Root) den Ziel-Namespace der XSD haben muss; alle anderen verschachtelten innerhalb, solange sie lokal definiert sind (wie der Autor tat) nicht; elementFormDefault steuert das; in diesem Fall wäre unqualifiziert. –

+0

Ich sehe Ihren Standpunkt. Danke Peter. – Phani

0

Sie können viel über Namespaces und ihre Beziehung in Bezug auf die Validierung von hier aus verstehen.

XML Schema Validation

0

Denken Sie daran, dass Präfixe irrelevant sind. Es ist der Namensraum, der zählt.

Wenn das Element "maps" in keinem Namespace sein soll, müssen Sie es im Schema so deklarieren. Derzeit haben Sie es als globale Elementdeklaration in einem Schemadokument mit einem Zielnamespace deklariert.

Ihre Anforderung scheint sehr seltsam. Ihr Instanzdokument deklariert einen Namespace, verwendet diesen Namespace jedoch nicht für eines der Elemente im Dokument. Das ist legal, aber es ist eine sehr seltsame Sache, die man machen möchte.