diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp index e3a1fb477d48d31950431da1033361607498e6a8..694c482ae066152bd791be5f3fcc2984e2089b24 100644 --- a/src/xercesc/internal/IGXMLScanner2.cpp +++ b/src/xercesc/internal/IGXMLScanner2.cpp @@ -224,7 +224,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs ValueValidate = true; } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_SCHEMALOCACTION)) + else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_SCHEMALOCATION)) { // use anyURI as the validator // tokenize the data and use the anyURI data for each piece @@ -239,7 +239,7 @@ IGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs ValueValidate = false; tokenizeBuffer = true; } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCACTION)) + else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION)) { attrValidator = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYURI); //We should validate this value however @@ -1711,9 +1711,9 @@ void IGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) const XMLCh* valuePtr = curPair->getValue(); const XMLCh* suffPtr = &rawPtr[colonInd + 1]; - if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_SCHEMALOCACTION)) + if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_SCHEMALOCATION)) parseSchemaLocation(valuePtr); - else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCACTION)) + else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION)) resolveSchemaGrammar(valuePtr, XMLUni::fgZeroLenString); if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) { @@ -1753,8 +1753,11 @@ void IGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr) if (size % 2 != 0 ) { emitError(XMLErrs::BadSchemaLocation); } else { + // We need a buffer to normalize the attribute value into + XMLBuffer normalBuf(1023, fMemoryManager); for(XMLSize_t i=0; i<size; i=i+2) { - resolveSchemaGrammar(fLocationPairs->elementAt(i+1), fLocationPairs->elementAt(i)); + normalizeAttRawValue(SchemaSymbols::fgXSI_SCHEMALOCATION, fLocationPairs->elementAt(i), normalBuf); + resolveSchemaGrammar(fLocationPairs->elementAt(i+1), normalBuf.getRawBuffer()); } } } diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp index 95ab0f4f7f821ca5c3efc7bc81df0305bfb81f2e..f5a4fbf1951c815b1e17405f661c7fcf33fb7fc0 100644 --- a/src/xercesc/internal/SGXMLScanner.cpp +++ b/src/xercesc/internal/SGXMLScanner.cpp @@ -2258,7 +2258,7 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs ValueValidate = true; } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_SCHEMALOCACTION)) + else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_SCHEMALOCATION)) { // use anyURI as the validator // tokenize the data and use the anyURI data for each piece @@ -2273,7 +2273,7 @@ SGXMLScanner::buildAttList(const RefVectorOf<KVStringPair>& providedAttrs ValueValidate = false; tokenizeBuffer = true; } - else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCACTION)) + else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION)) { attrValidator = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYURI); //We should validate this value however @@ -3594,9 +3594,9 @@ void SGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount) const XMLCh* valuePtr = curPair->getValue(); const XMLCh* suffPtr = &rawPtr[colonInd + 1]; - if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_SCHEMALOCACTION)) + if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_SCHEMALOCATION)) parseSchemaLocation(valuePtr); - else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCACTION)) + else if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_NONAMESPACESCHEMALOCATION)) resolveSchemaGrammar(valuePtr, XMLUni::fgZeroLenString); if (XMLString::equals(suffPtr, SchemaSymbols::fgXSI_TYPE)) { @@ -3634,8 +3634,11 @@ void SGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr) if (size % 2 != 0 ) { emitError(XMLErrs::BadSchemaLocation); } else { + // We need a buffer to normalize the attribute value into + XMLBuffer normalBuf(1023, fMemoryManager); for(XMLSize_t i=0; i<size; i=i+2) { - resolveSchemaGrammar(schemaLocation->elementAt(i+1), schemaLocation->elementAt(i)); + normalizeAttRawValue(SchemaSymbols::fgXSI_SCHEMALOCATION, schemaLocation->elementAt(i), normalBuf); + resolveSchemaGrammar(schemaLocation->elementAt(i+1), normalBuf.getRawBuffer()); } } } diff --git a/tests/src/XSTSHarness/regression/XERCESC-1831/ack.xml b/tests/src/XSTSHarness/regression/XERCESC-1831/ack.xml new file mode 100644 index 0000000000000000000000000000000000000000..00316fc34db466a70a97bed8e25606144acf30b7 --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-1831/ack.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ack xmlns="http://www.theriak.is/namespace/\:*?"<>|" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.theriak.is/namespace/\:*?"<>| ack.xsd" message_id="test_msg_id"/> + \ No newline at end of file diff --git a/tests/src/XSTSHarness/regression/XERCESC-1831/ack.xsd b/tests/src/XSTSHarness/regression/XERCESC-1831/ack.xsd new file mode 100644 index 0000000000000000000000000000000000000000..a16c2fd573facc98d2910384edd95591b11cd524 --- /dev/null +++ b/tests/src/XSTSHarness/regression/XERCESC-1831/ack.xsd @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema targetNamespace="http://www.theriak.is/namespace/\:*?"<>|" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.theriak.is/namespace/\:*?"<>|" elementFormDefault="qualified" attributeFormDefault="unqualified"> + <xs:element name="ack"> + <xs:complexType> + <xs:attribute name="message_id" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> +</xs:schema> diff --git a/tests/src/XSTSHarness/regression/Xerces.testSet b/tests/src/XSTSHarness/regression/Xerces.testSet index 7aec97406f9b34cb1aa000d3a42a2b4612eaa498..cdf11e44e10f96a1d2f09bde2a661b107be3c69c 100644 --- a/tests/src/XSTSHarness/regression/Xerces.testSet +++ b/tests/src/XSTSHarness/regression/Xerces.testSet @@ -611,6 +611,22 @@ <current status="accepted" date="2008-12-29"/> </schemaTest> </testGroup> + <testGroup name="XERCESC-1831"> + <annotation> + <documentation>Xerces-c can not parse instance with special chars (", < and >) in target namespace</documentation> + </annotation> + <documentationReference xlink:href="https://issues.apache.org/jira/browse/XERCESC-1831"/> + <schemaTest name="XERCESC-1831"> + <schemaDocument xlink:href="./XERCESC-1831/ack.xsd"/> + <expected validity="valid"/> + <current status="accepted" date="2009-08-10"/> + </schemaTest> + <instanceTest name="XERCESC-1831-1"> + <instanceDocument xlink:href="./XERCESC-1831/ack.xml"/> + <expected validity="valid"/> + <current status="accepted" date="2009-08-10"/> + </instanceTest> + </testGroup> <testGroup name="XERCESC-1832"> <annotation> <documentation>Namespace definitions attached to xs:extension/xs:restriction are not processed</documentation>