typeinfo.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 973 行 · 第 1/3 页

CPP
973
字号
/* * Copyright 2003,2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include "TypeInfo.hpp"#include <xercesc/util/PlatformUtils.hpp>#include <xercesc/util/XMLException.hpp>#include <xercesc/util/XMLString.hpp>#include <xercesc/parsers/XercesDOMParser.hpp>#include <xercesc/dom/DOMException.hpp>#include <xercesc/dom/DOM.hpp>#include <xercesc/validators/schema/SchemaSymbols.hpp>#if defined(XERCES_NEW_IOSTREAMS)#include <iostream>#else#include <iostream.h>#endif#define DOMTYPEINFOTEST(info, type, uri, line) \    tmp = XMLString::equals(info->getName(), type) && XMLString::equals(info->getNamespace(), uri);\    if(!tmp) { \      XERCES_STD_QUALIFIER cerr << "DOMTypeInfo test failed at line, " << line << "\nExpected values : typename '" << XMLString::transcode((XMLCh*)type) << "', uri '" << XMLString::transcode((XMLCh*)uri); \      XERCES_STD_QUALIFIER cerr << "'\nActual values   : typename '"; \      if(info->getName())   \        XERCES_STD_QUALIFIER cerr << XMLString::transcode(info->getName());  \      else \        XERCES_STD_QUALIFIER cerr << "(null)"; \      XERCES_STD_QUALIFIER cerr << "', uri '"; \      if(info->getNamespace())   \        XERCES_STD_QUALIFIER cerr << XMLString::transcode(info->getNamespace()); \      else \        XERCES_STD_QUALIFIER cerr << "(null)"; \      XERCES_STD_QUALIFIER cerr << "'\n" << XERCES_STD_QUALIFIER endl; \      passed = false; \    }bool tmp;// ---------------------------------------------------------------------------//  This is a simple class that lets us do easy (though not terribly efficient)//  trancoding of char* data to XMLCh data.// ---------------------------------------------------------------------------class XStr{public :    // -----------------------------------------------------------------------    //  Constructors and Destructor    // -----------------------------------------------------------------------    XStr(const char* const toTranscode)    {        // Call the private transcoding method        fUnicodeForm = XMLString::transcode(toTranscode);    }    ~XStr()    {        XMLString::release(&fUnicodeForm);    }    // -----------------------------------------------------------------------    //  Getter methods    // -----------------------------------------------------------------------    const XMLCh* unicodeForm() const    {        return fUnicodeForm;    }private :    // -----------------------------------------------------------------------    //  Private data members    //    //  fUnicodeForm    //      This is the Unicode XMLCh format of the string.    // -----------------------------------------------------------------------    XMLCh*   fUnicodeForm;};#define X(str) XStr(str).unicodeForm()//  This is a simple class that lets us do easy (though not terribly efficient)//  trancoding of XMLCh data to local code page for display.// ---------------------------------------------------------------------------class StrX{public :    // -----------------------------------------------------------------------    //  Constructors and Destructor    // -----------------------------------------------------------------------    StrX(const XMLCh* const toTranscode)    {        // Call the private transcoding method        fLocalForm = XMLString::transcode(toTranscode);    }    ~StrX()    {        XMLString::release(&fLocalForm);    }    // -----------------------------------------------------------------------    //  Getter methods    // -----------------------------------------------------------------------    const char* localForm() const    {        return fLocalForm;    }private :    // -----------------------------------------------------------------------    //  Private data members    //    //  fLocalForm    //      This is the local code page form of the string.    // -----------------------------------------------------------------------    char*   fLocalForm;};#define StrX(str) StrX(str).localForm()TypeInfo::TypeInfo() {    try    {        XMLPlatformUtils::Initialize();    }    catch(const XMLException &toCatch)    {        XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n"             << "  Exception message:"             << StrX(toCatch.getMessage()) << XERCES_STD_QUALIFIER endl;    }    parser = 0;}TypeInfo::~TypeInfo() {    XMLPlatformUtils::Terminate();}bool TypeInfo::testInBuiltTypesOnAttributes(bool DTDPresent) {    bool passed = true;    DOMElement *testEle = findElement(X("attrTest"));    DOMTYPEINFOTEST(testEle->getTypeInfo(), X("attrTestType"), X(""), __LINE__);    DOMAttr *testAttr;    testAttr = testEle->getAttributeNodeNS(0, X("anySimpleType"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_ANYSIMPLETYPE, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("string"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_STRING, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("boolean"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_BOOLEAN, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("decimal"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_DECIMAL, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("float"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_FLOAT, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("double"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_DOUBLE, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("duration"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_DURATION, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("dateTime"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_DATETIME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("time"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_TIME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("date"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_DATE, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("gYearMonth"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_YEARMONTH, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("gYear"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_YEAR, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("gMonthDay"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_MONTHDAY, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("gDay"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_DAY, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("gMonth"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_MONTH, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("hexBinary"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_HEXBINARY, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("base64Binary"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_BASE64BINARY, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("anyURI"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_ANYURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("QName"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_QNAME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("normalizedString"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_NORMALIZEDSTRING, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("token"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_TOKEN, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("language"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_LANGUAGE, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("NMTOKEN"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), XMLUni::fgNmTokenString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("NMTOKENS"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), XMLUni::fgNmTokensString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("Name"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_NAME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("NCName"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_NCNAME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("ID"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), XMLUni::fgIDString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("IDREF"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), XMLUni::fgIDRefString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("IDREFS"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), XMLUni::fgIDRefsString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    if(DTDPresent) {        testAttr = testEle->getAttributeNodeNS(0, X("ENTITY"));        DOMTYPEINFOTEST(testAttr->getTypeInfo(), XMLUni::fgEntityString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);        testAttr = testEle->getAttributeNodeNS(0, X("ENTITIES"));        DOMTYPEINFOTEST(testAttr->getTypeInfo(), XMLUni::fgEntitiesString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    }    testAttr = testEle->getAttributeNodeNS(0, X("integer"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_INTEGER, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("nonPositiveInteger"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_NONPOSITIVEINTEGER, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("negativeInteger"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_NEGATIVEINTEGER, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("long"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_LONG, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("int"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_INT, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("short"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_SHORT, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("byte"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_BYTE, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("nonNegativeInteger"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_NONNEGATIVEINTEGER, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("unsignedLong"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_ULONG, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("unsignedInt"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_UINT, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("unsignedShort"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_USHORT, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("unsignedByte"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_UBYTE, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("positiveInteger"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_POSITIVEINTEGER, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    //couple of defaulted ones    testAttr = testEle->getAttributeNodeNS(0, X("defaultString"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_STRING, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(0, X("defaultInt"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_INTEGER, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    //ns attr    testAttr = testEle->getAttributeNodeNS(X("http://www.w3.org/2000/xmlns/"), X("prefix"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_ANYURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    testAttr = testEle->getAttributeNodeNS(X("http://www.w3.org/2001/XMLSchema-instance"), X("noNamespaceSchemaLocation"));    DOMTYPEINFOTEST(testAttr->getTypeInfo(), SchemaSymbols::fgDT_ANYURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, __LINE__);    return passed;}bool TypeInfo::testInBuiltTypesOnElements() {    bool passed = true;    DOMNode *docEle = doc->getDocumentElement();    //the eleTest element.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?