0

ここで何が起こっているのかわかりません。私の小さなパーサー プログラムは、XML と XSD の変更を渡し、問題なく読み込みますが、これを実稼働システムに配置すると、問題が発生します。

XSD import ステートメントを使い始めたところです。いくつかのユーザー定義型を取り出して、それらをすべて独自の XSD に入れたら、私は何をしましたか。

ここにいくつかの典型的なエラーがあります

ファイル「/home/dfcuser/dataElementsTrans.xsd」でのエラー、行 = 7、列 = 37、XML 要素 =、インポートされたスキーマ「DFCTypes.xsd」には異なる targetNameSpace「http://www.quikq.com/xsd/」があります「http://www.quikq.com/DFCTypes」と宣言されているものからの「dataElementsTrans」

ファイル「/home/dfcuser/dataElementsTrans.xsd」でのエラー、行 = 29、列 = 55、XML 要素 =、スキーマ表現の制約: 名前空間 'http://www.quikq.com/DFCTypes' が宣言なしで参照されています

サンプル ドキュメントのプリアンブルは次のとおりです。

    DFCTypes.xsd
    ------------
    <xs:schema
        targetNamespace="http://www.quikq.com/DFCTypes" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified"> 

    dataElementsTrans.xsd
    ---------------------
    <xs:schema 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xmlns:dfct="http://www.quikq.com/DFCTypes" 
        targetNamespace="http://www.quikq.com/xsd/dataElementsTrans" 
        xmlns="http://www.quikq.com/xsd/dataElementsTrans"
        elementFormDefault="qualified" >

        <xs:import schemaLocation="DFCTypes.xsd" namespace="http://www.quikq.com/DFCTypes" />

    XML
    ---
    <dataElementsTrans 
        xmlns="http://www.quikq.com/xsd/dataElementsTrans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.quikq.com/xsd/dataElementsTrans dataElementsTrans.xsd">

私のサンプル パーサー プログラムと製品コードでは、何か別の方法でオンにする必要があります。私はまだこれにかなり慣れていないので、少し頭を悩ませています.

ありがとう!

4

2 に答える 2

0

開始タグを表示する xs:schema 要素は、一見問題ないように見えます。これらのエラー メッセージが表示されるとは思いません。

表示されているエラー メッセージは、実稼働システム上の DFCTypes.xsd のコピーがターゲット名前空間を ashttp://www.quikq.com/xsd/dataElementsTransではなく asとして宣言していることを示唆してhttp://www.quikq.com/DFCTypesいます。(ユーザー定義型を独自のスキーマドキュメントに移動しただけでなく、独自の名前空間にも移動しました。)引用した2番目のエラーメッセージは、処理中のTrans.xsdのコピーに名前空間宣言がないことを示唆していますxmlns:dfct="http://www.quikq.com/DFCTypes"(への参照と同様にxs:import行 8 の要素を行 7 にあるように)。したがって、私が最初に行うことは、実稼働サーバーのスキーマ プロセッサが、見つけていると思われるドキュメントを確実に見つけられるようにすることです。(私の通常のやり方は、読むべきだと思うドキュメントに構文エラーを植え付けて、それらがフラグ付けされているかどうかを確認することです。それは本番サーバーにとっては少し厳しいかもしれませんが、とにかく失敗している場合...)

于 2012-09-17T20:01:32.107 に答える
0

サンプル パーサーにエンティティ リゾルバー コードを入れると、実稼働プログラムのように爆発します。エンティティリゾルバーの使用についてはよくわかりません。

クラス定義:

    class MyResolver : public EntityResolver {
    private :
        string m_path;

    public :
        MyResolver(string path) { m_path = path; }

        InputSource* resolveEntity(const XMLCh* const publicId, const XMLCh* const systemId)
        {
            CStr2XStr path(m_path);

            if (XMLString::compareString(systemId, path.unicodeForm())) {
                return new LocalFileInputSource(path.unicodeForm());
            } else {
                return 0;
            }
        }
    };

実際の使用:

    MyResolver *resolver = new MyResolver("/home/dfcuser/authNotify.xsd");
    parser->setEntityResolver(resolver);

当面の解決策は、エンティティ リゾルバーのものを削除または修正することだと思います。私はいくつかのコメントを聞きたいです!

于 2012-09-18T15:54:51.800 に答える