当前位置: 首页 >> 程序设计 >> xerces-c编码示例
 

xerces-c编码示例

作者:      来源:nbaloverme.cublog.cn     发表时间:2008-03-20     浏览次数:      字号:    



bool XercesParserXml::del(std::string& srcBytes, const std::string& node)
{
    // init
    try {
        XMLPlatformUtils::Initialize();
    }
    catch (const XMLException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        std::cout << "Error during initialization! :\n"
             << message << "\n";
        XMLString::release(&message);
        return false;
    }
    // 1. load the right xml bytes from signal tree
    XercesDOMParser* parser = new XercesDOMParser();
    if (NULL == parser) {
        return false;
    }
    parser->setValidationScheme(XercesDOMParser::Val_Always);
    parser->setDoNamespaces(true); // optional
    ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
    parser->setErrorHandler(errHandler);
    InputSource* pInputSource = new MemBufInputSource((XMLByte *)srcBytes.c_str(), srcBytes.size(), X("GUID"));
    if (NULL == pInputSource) {
        delete parser;
        delete errHandler;
        return false;
    }
    // 2. parser the xml bytes to a DOM tree
    parser->parse(*pInputSource);
    DOMDocument* doc = parser->getDocument();
    if (NULL == doc) {
        delete parser;
        delete errHandler;
        delete pInputSource;
        return false;
    }
    // 3. find node of parameter in DOM tree
    DOMElement* rootElem = NULL;
    rootElem = doc->getDocumentElement();
    DOMNode* testNode = NULL;
    testNode = getNode(rootElem, node.c_str());
    if (NULL == testNode) {
        delete parser;
        delete errHandler;
        delete pInputSource;
        return false;
    }
    // 4. remove identifier node from DOM tree
    DOMNode* parentNode = testNode->getParentNode();
    DOMNode* oldNode = parentNode->removeChild(testNode);
    oldNode->release();

    // 5. serialize DOM tree and save it
    char* result;
    DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
    if (NULL == impl) {
        XERCES_STD_QUALIFIER cerr << "Requested implementation is not supported" << XERCES_STD_QUALIFIER endl;
        XMLPlatformUtils::Terminate();
        delete parser;
        delete errHandler;
        delete pInputSource;
        return false;
    }
    DOMWriter* theSerializer = ((DOMImplementationLS*)impl)->createDOMWriter();
    if (NULL == theSerializer) {
        delete parser;
        delete errHandler;
        delete pInputSource;
        return false;
    }
    if (theSerializer->canSetFeature(XMLUni::fgDOMWRTDiscardDefaultContent, true))
        theSerializer->setFeature(XMLUni::fgDOMWRTDiscardDefaultContent, true);
    if (theSerializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true))
        theSerializer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
    XMLCh* unicodeStr = theSerializer->writeToString(*rootElem);
    result = XMLString::transcode(unicodeStr);
    srcBytes = result;
    //printf("result: %s\n", result);
    XMLString::release(&unicodeStr);
    XMLString::release(&result);


    // release source
    theSerializer->release();
    delete parser;
    delete errHandler;
    delete pInputSource;

    return true;
}



int main()
{
        char* xmlFile = "x2.xml";

        char buf[4096] = {0};
        FILE* fp = fopen(xmlFile, "rb");
        if (!fp) {
            perror(xmlFile);
            exit(1);
        }
        size_t size;
        size = fread(buf, 1, sizeof(buf), fp);
        fclose(fp);
        std::cout << "size to be parser: " << size << std::endl;
        std::string srcDocBytes;
        srcDocBytes.assign(buf, size);
        std::string backup = srcDocBytes;

        XercesParserXml xml;
        bool flag = false;
        char testNode[1000] = {0};
        sprintf(testNode, "%s", "SendRoutingInfoRes.imsi"); //其中各结点以“.”分隔,格式如下:root.child.grandson
        std::string result;
        for (int i = 0; i < 1; i++) {
            srcDocBytes = backup;
            printf("\nfind node test ... \n");
            flag = xml.has(srcDocBytes, testNode);
            printf("\nget node test ...\n");
            result = xml.get(srcDocBytes, testNode);
            printf("get value: %s\n", result.c_str());
            printf("\nset node test ...\n");
            xml.set(srcDocBytes, testNode, "gnu means gnu not unix");
            printf("new content: %s\n", srcDocBytes.c_str());
            printf("\nremove test ...\n");
            xml.del(srcDocBytes, testNode);
            printf("after del operation: %s\n", srcDocBytes.c_str());
        }
        if (flag) {
            printf("%s has found\n", testNode);
        }
        else {
            printf("%s hasn't found\n", testNode);
        }
}

[1] [2] [3]

责任编辑 webmaster

 
发表评论  打印本文  推荐本文  加入收藏  返回顶部  关闭窗口
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •