2009-04-09 4 views
2

Im Wesentlichen möchte ich einige XHTML in ein XML-Dokument einbetten, die gegen ein benutzerdefiniertes Schema validieren müssen.Embedded XHTML-Snippet in XML-Dokument, und validieren gegen ein Schema

Voll Hintergrund:

Ich habe einen Webservice, die ein XML-Dokument verbraucht. Dieses XML-Dokument wird anhand eines benutzerdefinierten Schemas überprüft. Die Daten im XML werden analysiert und in einer Datenbank gespeichert und in einem nützlichen Format auf einer Website angezeigt.

Der Kunde, der den XML-Code an meinem Webservice absetzt, hat seinen eigenen internen "IT-/Programmierer-Typ". Er möchte einige benutzerdefinierte XHMTL in einigen Platzhaltern auf einigen der Websiteseiten anzeigen können.

Wir haben zugestimmt, dass er das XML, das er auf meinem Webservice auslöst, um 3 neue Elemente erweitern kann, die den HTML enthalten werden, und ich werde mein Schema entsprechend anpassen. Ich mache auch die Verarbeitung, um sein XHTML aus dem XML-Dokument zu den Webseiten zu bekommen. Ich habe versucht, eine <xs:any> im Schema verwenden

Ich will nicht cdata verwenden, wie das ziemlich unsicher sein könnte (man denke ich!), So:

<xs:element name="SomeXhtmlStuff" minOccurs="0"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:any minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Ich dachte, dies würde bedeuten, dass irgendein gültiges XML wäre in dem Element OK, z Alle XHTML-Tags wären in Ordnung, aber ich habe es versucht:

<SomeXhtmlStuff> 
    <p>This is a test HTML output for Job Details</p> 
</SomeXhtmlStuff> 

und das XML wird nicht validieren dagegen. Edit: Visual Studio 2008 darin automatische Validator gibt den Fehler "das 'p' Element ist nicht deklariert"

Ich habe nicht viel Erfahrung mit XML/Schema und ich erbte dieses Projekt, irgendwelche Vorschläge wäre mehr als herzlich willkommen!

Vielen Dank im Voraus!

Antwort

0

Sie sollten wahrscheinlich die xhtml Namespace in diesem xs setzen betrachten: jedes Element. Möglicherweise möchten Sie auch das processContents-Attribut in 'lax' ändern. Der lax-Attributwert informiert den Prüfer, dass er den Inhalt validieren soll, wenn er eine Definition finden kann.So könnte ein besseres Elemente-Modell sein:

<xs:element name="SomeXhtmlStuff" minOccurs="0" > 
    <xs:complexType> 
    <xs:complexContent mixed="true"> 
     <xs:restriction base="xs:anyType"> 
     <xs:sequence> 
      <xs:any processContents="lax" 
        namespace="http://www.w3.org/1999/xhtml" 
        minOccurs="0" 
        maxOccurs="unbounded"/> 
     </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
    </xs:complexType> 
    </xs:element> 

Natürlich könnten Sie auch, dass die gemischten Inhaltstyp ändern wollen, wenn er nur Elemente eingefügt wird in Ihre xml.

+0

danke dafür! Was soll ich dann "gemischt" ändern? – bplus

+0

Entschuldigung; späte Antwort durch hospitalisiertes Kind verursacht. Ich sollte klarer sein. Ich meinte, dass Sie mixed = 'false' haben sollten, es sei denn, Sie möchten ein gemischtes Inhaltsmodell (Text und Elemente) innerhalb des SomeXhtmlStuff-Elements. Ich vermute, dass du es nicht tust. "False" ist der Standardwert für "Mixed", sodass Sie ihn trotzdem weglassen können. –

+0

Das Hinzufügen von 'Namespace' macht Eclipse wütend auf mein XHTML-Markup. Ist es möglich, Schemas zu kaskadieren? Ich habe das W3C xhtml-strict-Schema für gute Maßnahme heruntergeladen. – RandomInsano

0

Ich glaube, die Verwendung eines CDATA-Abschnitts ist besser. In der Welt von (X) HTML gibt es zufällig Dokumente mit ungültigem Markup. Trotzdem zeigen die Browser tatsächlich nützliche Dinge an. Das Problem besteht also darin, dass Sie von Zeit zu Zeit wahrscheinlich keine Antworten erhalten, da das andere Ende versucht hat, ungültiges XHTML in ein XML-Dokument zu senden und nicht mehr ordnungsgemäß funktioniert.

Atom und RSS-Publisher verwenden übrigens CDATA-Abschnitte zum Einfügen von XHTML/HTML-Markup.

0

Was war der Validierungsfehler, den Sie erhalten haben?

Ich glaube, dass <xs:any/> bedeutet "alle XML, die validiert werden". Was wird <p/> gegen validieren?

+0

"Das P-Element ist nicht deklariert" ist der Fehler, den Visual Studio 2008 mir gibt. – bplus

+0

Und haben Sie das p-Element deklariert? Hat jemand? –

0

Nach etwas mehr googeln ich dieses Schema Schnipsel gefunden, die zu funktionieren scheint:

<xs:element name="SomeXhtmlStuff" minOccurs="0" > 
    <xs:complexType> 
    <xs:complexContent mixed="true"> 
     <xs:restriction base="xs:anyType"> 
     <xs:sequence> 
      <xs:any processContents="skip" 
        minOccurs="0" 
        maxOccurs="unbounded"/> 
     </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
    </xs:complexType> 
    </xs:element> 
Verwandte Themen