2014-09-23 11 views
7

Ich brauche ein Beispiel für XML-Schema, das alles und alles erlaubt.XML-Schema, das alles erlaubt (xsd: any)

Es klingt vielleicht komisch, aber ich brauche das, um mein aktuelles Schema zu debuggen. Die Sache ist, dass ich ein komplexes Objekt habe, das ich in einer Funktion (Teil einer DLL, die ich nicht kontrolliere) zusammen mit einem Schema verwende, und dass Funktionen mir das XML zurückgeben. Momentan gibt die Funktion eine Exception aus, weil beim Validieren mit dem Schema ein Fehler auftritt, der jedoch nicht auftreten sollte. Ich möchte also ein leeres Schema, ein Schema, das keinen Validierungsfehler verursacht, damit ich das von der Funktion ausgegebene XML sehen kann.

Ich habe versucht, mein aktuelles Schema zu nehmen und nur das xs: schema-Tag zu behalten, um ein leeres Schema zu erstellen, aber das hat offensichtlich nicht funktioniert.

Antwort

6

XML-Schema kann nicht angeben, dass ein Dokument unabhängig von seinem Inhalt gültig ist.

Wenn Sie jedoch das Wurzelelement angeben, sind in der Lage, können Sie xs:anyAttribute und xs:any verwenden alle Attribute auf dem Root-Elemente und jede XML unter der Wurzel zu ermöglichen:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:anyAttribute processContents="skip"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

In Ihrem Fall, Solange Sie eine endliche Anzahl von möglichen Root-Elementnamen sicherstellen können, können Sie mit dieser Technik beliebigen XML-Inhalt unter einem Root-Element mit einem bekannten Namen zulassen.


aktualisieren: Das kann mehr geschrieben werden viel prägnanter [Credit: C. M. Sperberg-McQueen]:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"/> 
</xs:schema> 

Beachten Sie, dass dies erlaubt ist, but not requiring, root to be empty.

+1

Das funktioniert und es passt perfekt zu meiner Situation. Vielen Dank. – Shadowxvii

+3

Das Deklarieren von 'root' mit' 'würde in den meisten normalen Situationen denselben Effekt haben und würde kürzer sein. –

+0

Ausgezeichnet. Antwort aktualisiert Danke, C. M. Sperberg-McQueen! – kjhughes

2

Es ist oft angenommen, dass ein XML-Schema Dokumente in th partitioniert welche gültig sind und welche nicht. Es ist eigentlich eher subtiler als das. Wenn Sie die Validierung aufrufen, müssen Sie angeben, wie die Validierung durchgeführt werden soll. Der häufigste Aufruf ist die strikte Validierung. In diesem Fall muss entweder der Name des Stammelements in Ihrem Instanzdokument dem Namen einer globalen Elementdeklaration in Ihrem Schema entsprechen oder ein xsi: type-Attribut, das einem globalen Typ entspricht Definition in Ihrem Schema. Daraus folgt, dass kein endliches Schema jeder Dokumenteninstanz unter strenger Validierung entspricht.

Prinzipiell können Sie auch einen Schema-Prozessor aufrufen, um eine laxe Validierung durchzuführen. Wenn in den globalen Elementdeklarationen im Schema keine Übereinstimmung für den Stammelementnamen gefunden wird, ist die Validierung erfolgreich. Daher entspricht das leere Schema (keine Deklarationen) jedem Instanzdokument unter laxer Validierung.

Sie können die Validierung auch für einen benannten Typ aufrufen. Wenn Sie eine Validierung für den benannten Typ xs: anyType aufrufen, ist jede Instanz gültig, unabhängig davon, was das Schema sagt.

Vorbehalt: Ich habe die Regeln hier erheblich vereinfacht.

+0

Nachdem dies alles gesagt wurde, ist die praktische Antwort auf Ihren Anwendungsfall: Wenn Sie Ihr XML als gültig behandeln wollen, unabhängig davon, was es enthält, dann überspringen Sie den Validierungsschritt. –

+1

Aber die Sache ist, dass ich keine Kontrolle darüber habe, wie das XML und das Scema verwendet werden. Ich kann nur ein Objekt und ein Schema an einen Funktionsteil einer externen DLL übergeben. – Shadowxvii

+0

Dann ist vielleicht die beste Lösung, das Dokument zu lesen, den Namen des Stammelements zu ermitteln und ein Schema zu generieren, das diesen Stammelementnamen mit type = "xs: anyType" deklariert. –

0

Sie brauchen oder wollen kein Schema. XML documents can be classified as "well-formed" and "valid".

Wie die obigen Antwort lautet:

XML, die den XML-Standard entspricht betrachtet ist gut ausgebildet, während XML, die zu einer DTD [oder Schema] haften gültig betrachtet.

Ich sollte darauf hinweisen, dass alle gültigen XML-Dokumente auch gut ausgebildet sind. Aber in Ihrem Fall interessiert Sie die "Gültigkeit" des XML-Dokuments nicht, es ist nur gut strukturiert. Alle XML-Parser können (müssen) tatsächlich nach Wohlgeformtheit suchen, und die Schema-Validierung erfordert normalerweise zusätzliche Schritte.

Schauen Sie, wie Sie die erstere (überprüfen Sie auf Wohlgeformtheit) tun können, ohne letztere zu zwingen (Validierung).

Verwandte Themen