2010-12-12 12 views
2

Angenommen, ich habe ein XML-Schema und möchte einige Erweiterungen an mehreren Knoten unterstützen. Eine Erweiterung sollte innerhalb dieser Knoten gültige XML sein.XML mit unbekannten Elementen erweitern

Ich weiß, dass dies mit dem <beliebigen> Element in Ihrem Schema implementiert werden kann. In meinem XML, das mein Schema verwendet, möchte ich jedoch, dass diese Erweiterung nur Knoten von einem anderen XSD verwendet. So geben Sie das Schema der Erweiterung zur Laufzeit an und können diese Erweiterung dann gegen das Erweiterungsschema validieren.

Im folgenden Beispiel wird ein statisches Extension-Schema:


<xs:element name="notes" minOccurs="0"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:any namespace="http://www.w3.org/1999/xhtml" 
      minOccurs="0" maxOccurs="unbounded" 
      processContents="skip"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Jetzt möchte ich dieses Schema in meinem XML angeben, zum Beispiel (Ich bin ein Neuling), wie folgt aus:


<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="myschema.xsd"> 
    <bar> 
    <extension> 
     <html namespace="http://www.w3.org/1999/xhtml"> 
     <body>Hello, World!</body> 
     </html> 
    </extension> 
    </bar> 
</foo> 

Was ist der beste Ansatz dafür? Idealerweise möchte ich in meinem XML eine Liste der Schemas haben, die ich in den Erweiterungsknoten meines XML verwende.

Danke!

== Bearbeitet, ausführlichere Erklärung: ==

Ich möchte benutzerdefinierte XML-Daten in bestimmten Knoten unterstützen. Ich kenne das Schema dieser Erweiterung während des Schreibens meines "Master" -Schemas nicht.

Ich habe das folgende Fragment in meinem XSD angegeben:


<xs:element name="extension"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:any namespace="##other" processContents="strict"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

und die folgenden XML verwenden möchten:


<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd" > 
    <bar> 
     <extension> 
      <html xmlns="http://www.w3.org/1999/xhtml"> 
       <body2>Hello, world!</body2> 
      </html> 
     </extension> 
    </bar> 
</foo> 

Jetzt mache ich einen Parser-Fehler wollen, weil < body2 nicht gültig ist XHTML-Element. Allerdings beschwert sich der XMLSpy-Parser bereits über das < html> -Element, das nicht gültig ist.

+0

Ich kann keinen Fehler sehen! XMLSpy kann dumm sein und die Namespaces nicht wechseln. Jedoch ... body2 ist an dieser Stelle ein ungültiges Element! Was wenn du Körper nimmst? –

+0

Siehe meine Bearbeitung. XMLSpy hat das Recht, das html-Element abzulehnen: Sie haben nicht angegeben, wo Sie das Schema dafür erhalten sollen. –

Antwort

0

Use „strenge“ Verarbeitung zu beauftragen, dass der Inhalt des jedes Elements gegen das Schema validiert, dh

<xs:element name="notes" minOccurs="0"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:any namespace="http://www.w3.org/1999/xhtml" 
      minOccurs="0" maxOccurs="unbounded" 
      processContents="strict"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Validierung des Dokuments sollte dann ausfallen, da der Prozessor wahrscheinlich nicht in der Lage ist, ein Schema zu erhalten für XHTML. Sie müssten diese im Instanzdokument auch wie so spezifizieren:

<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="test.xsd"> 
<extension> 
    <html xmlns="http://www.w3.org/1999/xhtml" 
    xsi:schemaLocation="http://www.w3.org/1999/xhtml 
         http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd"> 
    <body2>Hello, world!</body2> 
    </html> 
</extension> 
</foo> 

nun noch viele XSD-Validator auf diese ersticken, da sie das schema Attribut auf dem HTML-Element nicht berücksichtigen (obwohl sie sollten zu, pro Spezifikation). Das SchemaLocation-Attribut in das Root-Element verschieben (oder möglicherweise nicht) Dinge verbessern: Wenn der Validator sich über das HTML-Element beschwert, ist es defekt.

+0

Danke Martin. Vielleicht war ich in meiner Frage nicht klar genug (oder ich verstehe die Antwort nicht). Ich meine, dass ich das Erweiterungsschema in meinem "Master" -Schema nicht kenne, also kann ich dieses Schema nicht statisch definieren, wie im ersten Fragment. Bitte beachten Sie meinen Zusatz im Startthema. Danke noch einmal! – eiri

+0

Ausgezeichnet! Ja, ich verstehe jetzt, was falsch ist.Vielen Dank für deine Hilfe. – eiri

Verwandte Themen