2012-11-04 2 views
7

Ich möchte eine Frage zur Validierung von XML-Dokumenten mit den entsprechenden XML-Schemata stellen, und ich würde mich freuen, wenn Sie mir bitte eine Hand geben könnten. Eigentlich habe ich angefangen, etwas über XML-Schemata zu lernen (ich bin ein absoluter Anfänger). Ich habe das Buch "Definitives XML-Schema" von Priscilla Walmsley (2. Auflage) gekauft, das XML Schema 1.1 präsentiert (was meiner Meinung nach die neueste Version ist).Kann Oracle XML mithilfe eines XSD-Schemas im lokalen Dateisystem validieren?

Jetzt ist das Problem, dass in allen Beispielen und Übungen des Buches die Namespaces und der Speicherort der Schemadateien über eine Web-URL angegeben werden. Hier

ist ein Beispiel des Buchs:

Dies ist das Schema

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://datypic.com/prod" 
      xmlns:prod="http://datypic.com/prod"> 

    <xs:element name="product" type="prod:ProductType"/> 
    <xs:complexType name="ProductType"> 
     <xs:sequence> 
      <xs:element name="number" type="xs:integer"/> 
      <xs:element name="size" type="prod:SizeType"/> 
     </xs:sequence> 
     <xs:attribute name="effDate" type="xs:date"/> 
    </xs:complexType> 
    <xs:simpleType name="SizeType"> 
     <xs:restriction base="xs:integer"> 
      <xs:minInclusive value="2"/> 
      <xs:maxInclusive value="18"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

Und die XML-Inhalte gegen die oben genannten validiert werden wird diese

<prod:product xmlns:prod="http://datypic.com/prod" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://datypic.com/prod prod.xsd" 
      effDate="2011-04-12"> 
    <number>557</number> 
    <size>10</size> 
</prod:product> 

Offensichtlich [ http://datypic.com/prod] ist eine Website, die vom Autor gepflegt wird, so dass ich keine Datei auf dieser Seite für meine Übungen hinzufügen oder löschen kann, während ich dieses Buch lese. Als Ergebnis muss ich sowohl XML- als auch XSD-Dokumente auf meiner lokalen Festplatte speichern (ich benutze Linux Fedora Core 17 X86_64). Was ich also tat, war, den Inhalt des Schemas in eine Datei mit dem Namen 'Example-01.xsd' und den XML-Inhalt in eine Datei mit dem Namen 'Example-01.xml' zu schreiben.

Ich benutze das Oracle PL/SQL-Paket DBMS_XMLSCHEMA (Enterprise Edition 11.2.0.1.0), um zuerst das Schema zu registrieren und dann die Validate-Methode des XMLType-Objekts aufzurufen, um mein XML-Dokument gegenüber dem Schema zu validieren der folgende Link:

https://forums.oracle.com/forums/thread.jspa?messageID=2462207

ich habe ein Verzeichnis (von CREATE DIRECTORY) Anweisung in oracle erstellt:

/home/Zug/Dokumente/myutl_file_dir/

Wo ich meine beiden XS2-Dokumente XML & ablegen. Hier ist genau, wie ich die oben genannten XML-Inhalte geändert, um zu verweisen lokal in XSD

<prod:product xmlns:prod="http://datypic.com/prod" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://datypic.com/prod file:///home/train/Documents/myutl_file_dir/Example-01.xsd" 
       effDate="2011-04-12"> 
    <number>557</number> 
    <size>10</size> 
</prod:product> 

Also, wenn Sie die neuen XML-Inhalte mit dem oben genannten Beispiel zu vergleichen, das einzige, was ich hinzugefügt war file:///home/train/Documents/myutl_file_dir/Example-01.xsd am Ende des Wertes von xsi: schemaLocation, um auf die lokale Festplatte verweisen. Ich fand diese Methode, hier:

http://lists.w3.org/Archives/Public/xmlschema-dev/2001Dec/0161.html

Nun, das Problem ist, dass es nicht funktioniert. Als ich mein Skript ausführen, um das Dokument zu validieren, indem die schemaValidate() -Methode des XMLType Objekts aufrufen, hier ist Oracle-Fehlermeldung:

BEGIN 
* 
ERROR at line 1: 
ORA-19030: Method invalid for non-schema based XML Documents. 
ORA-06512: at "SYS.XMLTYPE", line 354 
ORA-06512: at "TRAIN2012.ZXML_PKG", line 176 
ORA-06512: at line 2 

Was ich von der Fehlermeldung "Methode ungültig für nicht verstehen Schemabasierte XML-Dokumente ist, dass Oracle den Dateipfad ignoriert hat, den ich für die Schemadatei definiert habe, und dass kein Schema für dieses XML-Dokument deklariert wurde.

Irgendeine Idee? Wie kann ich mit diesem Problem umgehen?

Vielen Dank im Voraus,

Dariyoosh

Antwort

7

OK, nach viel googeln und dank nebesnak an stefan‘Kommentar fand ich zwei Probleme das verursachte den Fehler:

Der erste, wie Stefan erwähnte, ist, dass DBMS_XMLSCHEMA.registerSchema nur auf schemabasierte Dokumente angewendet werden kann. Zunächst, was ich in meinem PL/SQL-Code war so etwas getan hatte:

So wie Sie es sehen können, ist absolut keine Verbindung zwischen dem registrierten Schema und dem XMLType Objekt, das zu meinem XML-Dokument bezieht. Was ich tun musste war:

l_xml_file_content := 
    XMLType(
      'Here I put the content of my XML document' 
     ).createSchemaBasedXML('and here I put the very same schema URL used during registereation while I registered the schema by calling the DBMS_XMLSCHEMA.registerSchema method') 

So wurde das erste Problem gelöst und mein XML-Dokument wurde ein Schema-basierte.

Das zweite Problem war die Tatsache, dass das XML-Dokument gegen das Schema in dem Buch validiert werden war in folgenden Weise definiert:

<prod:product xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:prod="http://datypic.com/prod" 
       xsi:schemaLocation="http://datypic.com/prod prod.xsd" 
       effDate="2011-04-12"> 

    <number>557</number> 
    <size>10</size> 
</prod:product> 

Was ich von 'verstanden xsi: schema = "http: //datypic.com/prod prod.xsd "" war, dass der erste Teil davon, das heißt http://datypic.com/prod bezieht sich auf den targetNameSpace und den zweiten Teil durch ein Leerzeichen getrennt, das heißt , prod.xsd, wird verwendet, um auf den Speicherort (als URL) des Schemadokuments zu verweisen, das wahr ist . Aber was ich nicht wusste, war, dass in Oracle DBMS_XMLSCHEMA-Implementierung dieser zweite Teil die gleiche URL sein muss, um das Schema durch den Aufruf der DBMS_XMLSCHEMA.RegisterSchema-Methode zu registrieren, sonst wird es nicht funktionieren. Und hier ist der Link zu der Oracle-Dokumentation, die dies bestätigt:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb03usg.htm#BABBGBDA

If the target XML schema declares a target namespace, then the schemaLocation attribute is used to identify the XML schema. The value of this attribute is a pair of values separated by a space:

  • the value of the target namespace declared in the XML schema
  • the schema location hint, the unique identifier passed to procedure DBMS_XMLSCHEMA.registerSchema when the schema is registered with the database

Und das war genau das, was ich nicht getan hatte, hatte ich das Schema mit "http registriert: // datypic. com/prod und nur weil in dem Buch gab es einen Dateinamen als der zweite Teil des xsi: schemaLocation (prod.xsd) Ich dachte, dass ich den Schema-Inhalt nur in eine Datei namens Beispiel-01.xsd schreiben und dann die Datei-URL für dieses Dokument bereitstellen müsste, file: /// home/train/Documents/myutl_file_dir /Beispiel 01.xsd. Das war wirklich eine dumme Sache, denn wenn Sie ein Schema mit oracle registrieren, indem Sie das DBMS_XMLSchema.registerSchema aufrufen, registriert oracle den Inhalt des XML-Schemadokuments. Was Oracle braucht, ist also die bei der Registrierung verwendete schemaURL, die es ermöglicht, das spezifische Schema eindeutig zu finden und zu identifizieren. Und das war genau mein Fehler, ich hatte gedacht, dass Orakel nach dem physischen Speicherort meiner Datei sucht.

Fazit: Ich das Schema von der Target registriert hatte: ‚http://datypic.com/prod‘ (na ja, es war nur ein Beispiel, ich anderen Wert gewählt haben könnte)

Also, die richtigen Wert von schemaLocation in meinem XML-Dokument war dies:

Und das löste das Problem.

Ich hoffe, dass dies denen helfen kann, die das gleiche Problem angetroffen haben.

Grüße,

Dariyoosh

0

Das Verfahren kann auf nur Schema basiert xmltype Objekte aufgerufen werden.

Versuchen Sie, Dokumente zu löschen und neu zu laden, bevor Sie ein XML-Schema registrieren, auf das sie verweisen.

Oracle XML DB Developer's Guide:

When you register an XML schema, keep in mind that the act of registering a schema has no effect on the status of any instance documents already loaded into Oracle XML DB Repository that reference the XML schema. Because the XML schema was not yet registered, such instance documents were non-schema-based when they were loaded. They remain non-schema-based after the schema is registered.

You must delete such instance documents, and reload them after registering the schema, in order to obtain schema-based documents.

Oracle XML Storage Tutorial.

Sie können das Schema im selben Verzeichnis wie das XML platzieren, das darauf verweist. In diesem Fall müssen Sie nur den Dateinamen wie folgt angeben:

xsi:noNamespaceSchemaLocation="Example-01.xsd" 

(gültig relative URI-Referenz)

+0

Nun, wie Sie sagten, ich das XML-Dokument ähnliche Aber wieder bekomme ich den gleichen Fehler. – dariyoosh

+0

@ stefan nebesnak Ich verwende targetNameSpace und daher ist xsi: noNamespaceSchemaLocation für dieses Problem nicht geeignet. Außerdem ist nur das Schema integriert (ich meine in der Datenbank registriert), das XML-Dokument ist nur ein lokales XMLType-Objekt, dessen Geltungsbereich auf eine lokale DECLARE begrenzt ist ... BEGIN ... END; PL/SQL-Block, so dass Dokumente nicht gelöscht und neu geladen werden müssen, da sie nicht integriert sind. Trotzdem danke ich Ihnen für die Bemerkung (die ich nicht kannte) und die Links – dariyoosh

Verwandte Themen