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"/> 所以我希望 getElementById 返回该元素。

4

2 回答 2

3

请看看这个

返回 ID 由 elementId 给出的 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 回答