Onega's profileOnegaBlogListsNetwork Tools Help

Blog


    October 14

    Use XPATH to filter "xml:lang" via MSXML in VC6

    #include "stdafx.h"
    #include <TCHAR.H>
    #include <stdio.h>
    #include <time.h>
    #import "msxml4.dll"
    using namespace MSXML2;

    inline void EVAL_HR( HRESULT _hr )
       { if FAILED(_hr) throw(_hr); }

    void printMSXMLError(const IXMLDOMDocument2Ptr& pXMLDoc)
    {
        try
        {
            IXMLDOMParseErrorPtr pError = NULL;
            EVAL_HR(pXMLDoc->get_parseError(&pError)
    );
            _ftprintf(stderr, pError->reason);
        }
        catch(...)
        {//Exception handling
        }
    }

    int main(int argc, char* argv[])
    {
        try
        {
            EVAL_HR(CoInitialize(NULL));
           
            //      Make sure MSXML 4.0 is installed
           
            IXMLDOMDocument2Ptr pXMLDoc = NULL;
            EVAL_HR(pXMLDoc.CreateInstance("Msxml2.DOMDocument.4.0"));
           
            //      Load the document synchronously
            pXMLDoc->async = false;
           
            VARIANT_BOOL varLoadResult = pXMLDoc->load(_T("C:\\onega\\Untitled1.xml"));
            //      Load the XML document
            if (varLoadResult)
            {
                pXMLDoc->setProperty("SelectionLanguage", "XPath");
                IXMLDOMNodeListPtr pEnglishNodes = pXMLDoc->selectNodes("/employer/*[@xml:lang='en']");
                for (long i=0; i<pEnglishNodes->Getlength(); i++)
                {
                    IXMLDOMNodePtr pEnglishNode = pEnglishNodes->Getitem(i);
                    pEnglishNode->Gettext();
                    pEnglishNode->GetnodeName();
                    printf("node name:%s, text:%s\n",
                        (LPCSTR)pEnglishNode->GetnodeName(),
                        (LPCSTR)pEnglishNode->Gettext());
                }
            }
            else
            {//      Load Failed
                printMSXMLError(pXMLDoc);
            }
           
        }
        catch(...)
        {//      Exception handling
        }
       
        CoUninitialize();
        return 0;
    }
    January 16

    empty base64Binary value in XML

    MSXML4.0 reports error when an XML element has empty value of base64Binary type.
    The following url explained that empty value is valid
    http://lists.w3.org/Archives/Public/xmlschema-dev/2004Aug/0132.html
    Furthermore, the Second Edition of XMLSchema [2] has a regular 
    expression for base64Binary which explicitly allows empty (base64) 
    encodings.  hexBinary is just another encoding of byte sequences.
     
    [1] http://www.w3.org/TR/xmlschema-2/#hexBinary
    [2] http://www.w3.org/TR/2004/PER-xmlschema-2-20040318/#base64Binary
    So we changed to Xerces library. Interestingly, Xerces passed the validation.