DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=5675>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=5675 use of setExternalSchemaLocation() yields inconsistent behavior Summary: use of setExternalSchemaLocation() yields inconsistent behavior Product: Xerces-C++ Version: 1.6.0 Platform: PC OS/Version: Windows NT/2K Status: NEW Severity: Major Priority: Other Component: Validating Parser (Schema) (Xerces 1.5 or up only) AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] The gist of this bug is that I get different (erroneous) behavior depending on the contents of the string I feed to setExternalSchemaLocation(). If I don't use setExternalSchemaLocation(), and let the parser find the schemas through the schema locations specified internally in the document, the parse succeeds. If I list the "master" schema (the schema that imports the other ("child") schema) first in the external schema location string, or omit the the "child" schema, the parse will succeed. If I list the "child" schema before the "master" schema in the external schema location string, the parse fails. I have determined that this is because when the parser reaches line 282 of SchemaInfo.hpp (SchemaInfo::getImportInfo()), the import list (fImportList) is empty. The error is from line 4, column 38 of test.xml: "Prefix: 'barney' can not be resolved to a URI." Here's the code that shows the problem: --- #include "stdafx.h" #include "MyException.h" #include "MyErrorHandler.h" // Application-wide ininitialization and termination of Xerces XML parser. namespace { struct XmlInit { XmlInit() { XMLPlatformUtils::Initialize(); } ~XmlInit() { XMLPlatformUtils::Terminate(); } } xmlInit; CMySaxErrorHandler ErrHandler; } // When the schemas are listed in this order, the test document parse fails. LPCWSTR wszBadSchemaLocation = L"\ http://www.fred.com/common ./barney.xsd \ http://www.fred.com/test ./test.xsd"; // When the schemas are listed in this order, the test document parses properly. LPCWSTR wszGoodSchemaLocation1 = L"\ http://www.fred.com/test ./test.xsd \ http://www.fred.com/barney ./barney.xsd"; // When the "barney" namespace is omitted, the test document parses properly. LPCWSTR wszGoodSchemaLocation2 = L"\ http://www.fred.com/test ./test.xsd"; int wmain(int argc, wchar_t* argv[]) { if (argc != 2) { std::wcout << L"Usage is: XmlParse <filename>" << std::endl; } else { try { DOMParser parser; // Configure parser for a validating parse. parser.setErrorHandler(&ErrHandler); parser.setIncludeIgnorableWhitespace(false); parser.setDoSchema(true); parser.setValidationScheme(DOMParser::Val_Auto); parser.setDoNamespaces(true); parser.setCreateEntityReferenceNodes(false); parser.setToCreateXMLDeclTypeNode(false); // Letting the parser use the internal schema locations works. parser.parse(LocalFileInputSource(argv[1])); std::wcout << L"File '" << argv[1] << L"' parsed successfully using internal schema locations." << std::endl; // This external schema specification works. parser.setExternalSchemaLocation(wszGoodSchemaLocation1); parser.parse(LocalFileInputSource(argv[1])); std::wcout << L"File '" << argv[1] << L"' parsed successfully using (first version) external schema locations." << std::endl; // This external schema specification works. parser.setExternalSchemaLocation(wszGoodSchemaLocation2); parser.parse(LocalFileInputSource(argv[1])); std::wcout << L"File '" << argv[1] << L"' parsed successfully using (second version) external schema locations." << std::endl; // This one doesn't work. parser.setExternalSchemaLocation(wszBadSchemaLocation); parser.parse(LocalFileInputSource(argv[1])); std::wcout << L"File '" << argv[1] << L"' parsed successfully using (third version) external schema locations." << std::endl; } catch (const CMyException& e) { std::wcout << e << std::endl; } } return 0; } --- Here's the test document (test.xml): --- <?xml version='1.0' encoding='UTF-8' standalone='no'?> <root xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.fred.com/test ./test.xsd' xmlns='http://www.fred.com/test'> <child>empty-value</child> </root> --- Here is the "master" schema (test.xsd): --- <schema xmlns='http://www.w3.org/2001/XMLSchema' targetNamespace='http://www.fred.com/test' xmlns:barney='http://www.fred.com/barney' xmlns:test='http://www.fred.com/test' elementFormDefault='qualified' version='1.0'> <import namespace='http://www.fred.com/barney' schemaLocation='./barney.xsd'/> <complexType name='TestType'> <sequence> <element name='child' type='barney:TestValue' minOccurs='0' maxOccurs='unbounded'/> </sequence> </complexType> <element name='root' type='test:TestType'/> </schema> --- Here is the "child" schema (barney.xsd): --- <schema xmlns='http://www.w3.org/2001/XMLSchema' targetNamespace='http://www.fred.com/barney' xmlns:barney='http://www.fred.com/barney' elementFormDefault='qualified' version='1.0.0'> <simpleType name='TestValue'> <restriction base='normalizedString'> <enumeration value='value-1'/> <enumeration value='value-2'/> <enumeration value='value-3'/> <enumeration value='empty-value'/> </restriction> </simpleType> </schema> --- Put the schemas in the same folder as the input document, and set this folder as your project's working directory. If you wish, I can zip my entire VC++ project up and send it to you. Thanks, Tim Dodd Software Engineer Internet Security Systems --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
