static void _parseFile(const char* fileName, Boolean hideEmptyTags) { // cout << "Parsing: " << fileName << endl; Buffer text; FileSystem::loadFileToMemory(text, fileName); XmlParser parser((char*)text.getData(), 0, hideEmptyTags); XmlEntry entry; // Get initial comment and ignore parser.next(entry, true); // get next comment, check for file Description parser.next(entry, true); if (!String::equal(entry.text, "Test XML file") ) { throw CIMException(CIM_ERR_FAILED, "Comment Error"); } PEGASUS_ASSERT (parser.getLine () == 2); PEGASUS_ASSERT (parser.getStackSize () == 0); // Put the Comment back... parser.putBack (entry); PEGASUS_ASSERT (parser.getLine () == 2); PEGASUS_ASSERT (parser.getStackSize () == 0); while (parser.next(entry)) { if (verbose) { entry.print(); } } PEGASUS_ASSERT (parser.next (entry, true) == false); }
static void testWhitespaceHandling() { char text[] = "<tag attr=\"\r\nvalue + \">\r\nvalue + </tag>"; XmlParser parser(text); XmlEntry entry; // Make sure attribute value has whitespace normalized. parser.next(entry); const char* attrValue; PEGASUS_TEST_ASSERT(entry.getAttributeValue("attr", attrValue)); PEGASUS_TEST_ASSERT(strcmp(attrValue, "value +") == 0); // Make sure element value has leading and trailing whitespace trimmed, // but internal whitespace is not compressed. parser.next(entry); PEGASUS_TEST_ASSERT(entry.type == XmlEntry::CONTENT); PEGASUS_TEST_ASSERT(strcmp(entry.text, "value +") == 0); }
static void _parseFile(const char* fileName) { // cout << "Parsing: " << fileName << endl; Array<char> text; FileSystem::loadFileToMemory(text, fileName); text.append('\0'); XmlParser parser((char*)text.getData()); try { XmlEntry entry; while (parser.next(entry)) if (verbose) entry.print(); } catch (Exception& e) { cout << fileName << ": " << e.getMessage() << endl; } }
Boolean ProcessCimElement(CIMRepository& repository, XmlParser& parser) { XmlEntry entry; if (!parser.next(entry) || entry.type != XmlEntry::XML_DECLARATION) { throw(parser.getLine(), "expected XML declaration"); } if (!XmlReader::testStartTag(parser, entry, "CIM")) return false; String cimVersion; if (!entry.getAttributeValue("CIMVERSION", cimVersion)) { throw XmlValidationError(parser.getLine(), "missing CIM.CIMVERSION attribute"); } String dtdVersion; if (!entry.getAttributeValue("DTDVERSION", dtdVersion)) { throw XmlValidationError(parser.getLine(), "missing CIM.DTDVERSION attribute"); } if (!ProcessDeclarationElement(repository, parser)) { throw XmlValidationError(parser.getLine(), "Expected DECLARATION element"); } XmlReader::expectEndTag(parser, "CIM"); return true; }
void testNamespaceSupport(Boolean hideEmptyTags) { XmlNamespace testNamespaces[] = { { "ns0", "urn:0", 0, 0 }, { "ns1", "urn:1", 1, 0 }, { "ns2", "urn:2", 2, 0 }, { 0, 0, 0, 0 } // Terminator }; XmlEntry entry; const XmlAttribute* attr; // Test namespace scoping { char xmlContent[] = "<a:tag xmlns:a=\"urn:0\" xmlns:b=\"urn:1\">" " <b:tag xmlns=\"urn:2\" ignore=\"false\" a:attr=\"true\">" " <tag/>" " </b:tag>" " <tag xmlns=\"urn:0\" xml:lang=\"en-US\">" " Data" " </tag>" " <d:tag xmlns:d=\"urn:x\"/>" " <b:tag xmlns:b=\"urn:1\"/>" "</a:tag>"; XmlParser p(xmlContent, testNamespaces, hideEmptyTags); // <a:tag xmlns:a=\"urn:0\" xmlns:b=\"urn:1\"> PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "a:tag")); PEGASUS_ASSERT(entry.nsType == 0); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); PEGASUS_ASSERT(p.getNamespace(0) != 0); PEGASUS_ASSERT(p.getNamespace(1) != 0); PEGASUS_ASSERT(p.getNamespace(2) == 0); // <b:tag xmlns=\"urn:2\" ignore=\"false\" a:attr=\"true\"> PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "b:tag")); PEGASUS_ASSERT(entry.nsType == 1); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); PEGASUS_ASSERT(p.getNamespace(2) != 0); attr = entry.findAttribute(0, "attr"); PEGASUS_ASSERT(attr != 0); PEGASUS_ASSERT(attr->nsType == 0); PEGASUS_ASSERT(strcmp(attr->name, "a:attr") == 0); PEGASUS_ASSERT(strcmp(attr->localName, "attr") == 0); PEGASUS_ASSERT(strcmp(attr->value, "true") == 0); PEGASUS_ASSERT(entry.findAttribute(1, "attr") == 0); attr = entry.findAttribute(2, "ignore"); PEGASUS_ASSERT(attr != 0); PEGASUS_ASSERT(attr->nsType == 2); PEGASUS_ASSERT(strcmp(attr->name, "ignore") == 0); PEGASUS_ASSERT(strcmp(attr->localName, "ignore") == 0); PEGASUS_ASSERT(strcmp(attr->value, "false") == 0); // <tag> PEGASUS_ASSERT(p.next(entry)); if (hideEmptyTags) PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG); else PEGASUS_ASSERT(entry.type == XmlEntry::EMPTY_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "tag")); PEGASUS_ASSERT(entry.nsType == 2); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); if (hideEmptyTags) { // </tag> PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "tag")); PEGASUS_ASSERT(entry.nsType == 2); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); } // </b:tag> PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "b:tag")); PEGASUS_ASSERT(entry.nsType == 1); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); PEGASUS_ASSERT(p.getNamespace(0) != 0); PEGASUS_ASSERT(p.getNamespace(1) != 0); PEGASUS_ASSERT(p.getNamespace(2) != 0); // <tag xmlns=\"urn:0\" xml:lang=\"en-US\"> PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "tag")); PEGASUS_ASSERT(entry.nsType == 0); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); PEGASUS_ASSERT(p.getNamespace(0) != 0); PEGASUS_ASSERT(p.getNamespace(1) != 0); PEGASUS_ASSERT(p.getNamespace(2) == 0); attr = entry.findAttribute("xml:lang"); PEGASUS_ASSERT(attr != 0); PEGASUS_ASSERT(attr->nsType == -1); PEGASUS_ASSERT(strcmp(attr->name, "xml:lang") == 0); PEGASUS_ASSERT(strcmp(attr->localName, "lang") == 0); PEGASUS_ASSERT(strcmp(attr->value, "en-US") == 0); // Data PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::CONTENT); PEGASUS_ASSERT(!strcmp(entry.text, "Data")); // </tag> PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "tag")); PEGASUS_ASSERT(entry.nsType == 0); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); // <d:tag xmlns:d=\"urn:x\"> PEGASUS_ASSERT(p.next(entry)); if (hideEmptyTags) PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG); else PEGASUS_ASSERT(entry.type == XmlEntry::EMPTY_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "d:tag")); PEGASUS_ASSERT(entry.nsType == -2); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); PEGASUS_ASSERT(p.getNamespace(-2) != 0); if (hideEmptyTags) { // </d:tag> PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "d:tag")); PEGASUS_ASSERT(entry.nsType == -2); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); PEGASUS_ASSERT(p.getNamespace(-2) != 0); } // <b:tag xmlns:b=\"urn:1\"> PEGASUS_ASSERT(p.next(entry)); if (hideEmptyTags) PEGASUS_ASSERT(entry.type == XmlEntry::START_TAG); else PEGASUS_ASSERT(entry.type == XmlEntry::EMPTY_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "b:tag")); PEGASUS_ASSERT(entry.nsType == 1); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); PEGASUS_ASSERT(p.getNamespace(-2) == 0); PEGASUS_ASSERT(p.getNamespace(0) != 0); PEGASUS_ASSERT(p.getNamespace(1) != 0); PEGASUS_ASSERT(p.getNamespace(2) == 0); if (hideEmptyTags) { // </b:tag xmlns:b=\"urn:1\"> PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "b:tag")); PEGASUS_ASSERT(entry.nsType == 1); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); PEGASUS_ASSERT(p.getNamespace(-2) == 0); PEGASUS_ASSERT(p.getNamespace(0) != 0); PEGASUS_ASSERT(p.getNamespace(1) != 0); PEGASUS_ASSERT(p.getNamespace(2) == 0); } // </a:tag> PEGASUS_ASSERT(p.next(entry)); PEGASUS_ASSERT(entry.type == XmlEntry::END_TAG); PEGASUS_ASSERT(!strcmp(entry.text, "a:tag")); PEGASUS_ASSERT(entry.nsType == 0); PEGASUS_ASSERT(!strcmp(entry.localName, "tag")); PEGASUS_ASSERT(p.getNamespace(0) != 0); PEGASUS_ASSERT(p.getNamespace(1) != 0); } // Test undeclared namespace { char xmlContent[] = "<a:tag xmlns:b=\"urn:1\"/>"; XmlParser p(xmlContent, testNamespaces, hideEmptyTags); ASSERT_XML_EXCEPTION(p.next(entry)); } // Test invalid QNames { char xmlContent[] = "<.a:tag xmlns:a=\"urn:0\"/>"; XmlParser p(xmlContent, testNamespaces, hideEmptyTags); ASSERT_XML_EXCEPTION(p.next(entry)); } { char xmlContent[] = "<a&:tag xmlns:a=\"urn:0\"/>"; XmlParser p(xmlContent, testNamespaces, hideEmptyTags); ASSERT_XML_EXCEPTION(p.next(entry)); } { char xmlContent[] = "<a:.tag xmlns:a=\"urn:0\"/>"; XmlParser p(xmlContent, testNamespaces, hideEmptyTags); ASSERT_XML_EXCEPTION(p.next(entry)); } { char xmlContent[] = "<a:ta:g xmlns:a=\"urn:0\"/>"; XmlParser p(xmlContent, testNamespaces, hideEmptyTags); ASSERT_XML_EXCEPTION(p.next(entry)); } { char xmlContent[] = "<a:ta"; XmlParser p(xmlContent, testNamespaces, hideEmptyTags); ASSERT_XML_EXCEPTION(p.next(entry)); } }