8

対応する XML スキーマに対する XML ドキュメントの検証について質問したいのですが、ご協力いただければ幸いです。実は、私は XML スキーマについて学び始めたばかりです (まったくの初心者です)。Priscilla Walmsley 著の「Definitive XML Schema」(第 2 版) を購入しました。この本では、XML Schema 1.1 (これが最新バージョンだと思います) が紹介されています。

問題は、この本のすべての例と演習で、名前空間とスキーマ ファイルの場所が Web URL を使用して指定されていることです。

本の例は次のとおりです。

これがスキーマです

<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>

そして、上記に対して検証される XML コンテンツはこれです

<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>

明らかに、[http://datypic.com/prod] は著者によって管理されているサイトであるため、この本を読んでいる間、演習のためにこのサイトのファイルを追加または削除することはできません。その結果、ローカル ハード ドライブに XML ドキュメントと XSD ドキュメントの両方を配置する必要があります (Linux Fedora Core 17 X86_64 を使用しています)。そこで私がしたことは、スキーマのコンテンツを「Example-01.xsd」という名前のファイルに入れ、XML コンテンツを「Example-01.xml」という名前のファイルに入れることでした。

次のリンクのように、Oracle PL/SQL パッケージ DBMS_XMLSCHEMA (Enterprise Edition 11.2.0.1.0) を使用して、最初にスキーマを登録し、次に XMLType オブジェクトの validate メソッドを呼び出してスキーマに対して XML ドキュメントを検証します。

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

Oracle で (CREATE DIRECTORY によって) ステートメントでディレクトリを作成しました。

/home/train/Documents/myutl_file_dir/

XML ドキュメントと XSD ドキュメントの両方を配置した場所。XSD をローカルで参照するために、上記の XML コンテンツを正確に変更した方法を次に示します。

<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>

したがって、新しい XML コンテンツを上記の例と比較すると、私が追加したのはfile:///home/train/Documents/myutl_file_dir/Example-01.xsd だけで、 xsi:schemaLocationの値の最後にあります。ローカル ハード ドライブを参照するようにします。ここでこの方法を見つけました:

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

さて、問題はそれが機能しないことです。XMLType オブジェクトの schemaValidate() メソッドを呼び出してドキュメントを検証するためにスクリプトを実行すると、次の Oracle エラー メッセージが表示されます。

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

エラーメッセージ「メソッドが非スキーマベースの XML ドキュメントに対して無効です」から理解できることは、オラクルはスキーマファイルに定義したファイルパスを単純に無視し、この XML ドキュメントに対して宣言されたスキーマがないと見なしたことです。

何か案が?どうすればこの問題に対処できますか?

前もって感謝します、

ダリヨーシュ

4

2 に答える 2

8

OK、多くのグーグル検索と stefan nebesnak のコメントのおかげで、エラーの原因となった 2 つの問題が見つかりました。

1 つ目は、Stefan が述べたように、DBMS_XMLSCHEMA.registerSchema はスキーマ ベースのドキュメントにのみ適用できるということです。PL/SQLコードで最初に行ったことは、次のようなものでした。

l_xml_file_content := XMLType('Here I put the content of my XML document')
l_xml_file_content.schemaValidate();

ご覧のとおり、登録されたスキーマと、XML文書を参照する XMLType オブジェクトとの間にはまったくリンクがありません。私がしなければならなかったのはこれでした:

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')

それで、最初の問題は解決され、私の XML 文書はスキーマベースになりました。

2 つ目の問題は、本書では、スキーマに対して検証される XML ドキュメントが次のように定義されていたことです。

<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>

「 xsi:schemaLocation="http://datypic.com/prod prod.xsd" 」から私が理解したのは、その最初の部分、つまりhttp://datypic.com/prodが targetNameSpace を参照し、スペースで区切られた 2 番目の部分、つまりprod.xsdは、真のスキーマ ドキュメントの場所を (URL として) 参照するために使用されます。しかし、私が知らなかったのは、オラクルの DBMS_XMLSCHEMA 実装では、この 2 番目の部分は、DBMS_XMLSCHEMA.RegisterSchema メソッドを呼び出してスキーマを登録するために使用されるものとまったく同じ URL でなければならないということでした。そうでなければ機能しません。そして、これを確認するオラクルのドキュメントへのリンクは次のとおりです。

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

ターゲット XML スキーマでターゲット名前空間が宣言されている場合、schemaLocation 属性を使用して XML スキーマを識別します。この属性の値は、スペースで区切られた値のペアです。

  • XML スキーマで宣言されたターゲット名前空間の値
  • スキーマの場所のヒント。スキーマがデータベースに登録されるときにプロシージャ DBMS_XMLSCHEMA.registerSchema に渡される一意の識別子

そして、それはまさに私がしなかったことであり、スキーマを ' http://datypic.com/prod ' に登録していたのですが、その本には xsi:schemaLocation の 2 番目の部分 (prod .xsd) 私がしなければならないことは、たとえば Example-01.xsd という名前のファイルにスキーマの内容を入れてから、このドキュメントへのファイル URL ( file:///home/train/Documents/myutl_file_dir ) を提供することだけだと思っていました。 /Example-01.xsd. DBMS_XMLSchema.registerSchema を呼び出してスキーマをオラクルに登録すると、オラクルは XML スキーマ ドキュメントのコンテンツを登録するため、これは本当にばかげたことでした。したがって、オラクルが必要とするのは、登録時に使用される schemaURL です。これにより、特定のスキーマを一意に見つけて識別することができます。オラクルが私のファイルの物理的な場所を探していると思っていたのは、まさに私の間違いでした。

結論: targetNameSpace : 'http://datypic.com/prod' でスキーマを登録しました (これは単なる例であり、他の値を選択することもできました)。

したがって、XML ドキュメント内の schemaLocation の正しい値は次のとおりです。

xsi:schemaLocation="http://datypic.com/prod prod.xsd 
                    http://datypic.com/prod prod.xsd"

そして、これで問題は解決しました。

これが同じ問題に遭遇した人に役立つことを願っています。

よろしく、

ダリヨーシュ

于 2012-11-08T17:12:22.247 に答える
0

このメソッドは、スキーマ ベースの xmltype オブジェクトでのみ呼び出すことができます。

ドキュメントが参照する XML スキーマを登録する前に、ドキュメントを削除して再読み込みしてください。

Oracle XML DB開発者ガイド:

XML スキーマを登録する場合、スキーマを登録しても、その XML スキーマを参照する Oracle XML DB リポジトリにすでにロードされているインスタンス ドキュメントのステータスには影響しないことに注意してください。XML スキーマがまだ登録されていないため、このようなインスタンス ドキュメントは、読み込まれたときに非スキーマ ベースでした。スキーマが登録された後、それらは非スキーマベースのままです。

スキーマベースのドキュメントを取得するには、そのようなインスタンス ドキュメントを削除し、スキーマの登録後に再ロードする必要があります。

Oracle XML ストレージのチュートリアル

スキーマは、それを参照する XML と同じディレクトリに配置できます。この場合、次のようにファイル名を指定するだけです。

    xsi:noNamespaceSchemaLocation="Example-01.xsd"

(有効な相対 URI 参照)

于 2012-11-06T18:24:47.943 に答える