1

Xerces-C++ を使用して XML ドキュメントを解析しようとしています。IDで要素を検索できるようにしたいだけです。以下のコードを書きましたが、うまくいきません。...

try {
        XMLPlatformUtils::Initialize();
    }
    catch(XMLException& e) {
        char* message = XMLString::transcode( e.getMessage() );
        cout << "XML toolkit initialization error: " << message << endl;
        XMLString::release( &message );
    }

    XMLCh tempStr[100];
    XMLString::transcode("LS", tempStr, 99);
    DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
    DOMLSParser* parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0);

    char *filename = "C:\\odx1.xml";


    xercesc::DOMDocument *doc = 0;

    try {
        doc = parser->parseURI(filename);
        DOMElement *element = doc->getElementById(XMLString::transcode("test"));
        if(element != NULL) cout << "element found";
        cout << "DONE";
    }
    catch (const XMLException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Exception message is: \n"
                << message << "\n";
        XMLString::release(&message);
        return;
    }
    catch (const DOMException& toCatch) {
        char* message = XMLString::transcode(toCatch.msg);
        cout << "Exception message is: \n"
                << message << "\n";
        XMLString::release(&message);
        return;
    }
    catch (...) {
        cout << "Unexpected Exception \n" ;
        return ;
    }

    parser->release();
    XMLPlatformUtils::Terminate();
}
...

XML は次のとおりです。

<ODX MODEL-VERSION="2.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="odx.xsd">
  <DIAG-LAYER-CONTAINER ID="test">
    test done
  </DIAG-LAYER-CONTAINER>
</ODX>

「要素が見つかりました」と出力されると思いますが、プログラムは「要素が見つかりました」と出力せずに正しく終了します。

とにかく... XMLドキュメントに関連付けられたXSDファイルで、私が探している<xsd:attribute name="ID" type="xsd:ID" use="required"/> 要素は

4

2 に答える 2

3

これを見てください

elementId で指定された ID を持つ DOMElement を返します。そのような要素が存在しない場合は、null を返します。複数の要素がこの ID を持つ場合、動作は定義されません。DOM 実装には、どの属性が ID 型であるかを示す情報が必要です。「ID」という名前の属性は、特に定義されていない限り、タイプ ID ではありません。属性が ID 型かどうかがわからない実装は、null を返すことが期待されます。

たぶん、他の手段で要素を取得できますか?タグ名として?

于 2013-03-15T15:01:19.287 に答える
2

解決策は次のとおりです。

XMLCh tempStr[100];
    XMLString::transcode("LS", tempStr, 99);
    DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
    DOMLSParser* parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0);
    DOMConfiguration* conf = parser->getDomConfig ();
    conf->setParameter(XMLUni::fgXercesSchema, true);
    char *filename = "C:\\odx1.xml";


    xercesc::DOMDocument *doc = 0;

    try {
        doc = parser->parseURI(filename);
        DOMElement *element = doc->getElementById(XMLString::transcode("test"));
        if(element != NULL) cout << "element found";
        cout << "DONE";
    }
于 2013-03-22T16:08:43.023 に答える