Hi,
I am using Xalan-C 1.10 and Xerces 2.7. I have to write a wrapper
class whose functions gives me the results of XPath queries.
I got an example in the samples SimpleXPathAPI which serves my
purpose. But I have few problems. I wanted to split the entire thing
into 2 functions so that the instance of XalanDocument gets created
only once.
I have a private function which returns me the xalan_document and
another public function which should give me the result of an XPath
query. (XPath query being the parameter of the function).
I am pasting the sample of my code to give you idea, but this doesn't
work.It gives me a run time error at this line:
XalanDocumentPrefixResolver thePrefixResolver(xalan_document);
saying some access violation reading some location.
int MyClass::create_xalan_document(unsigned short* filename) {
// Initialize the XalanSourceTree subsystem...
XalanSourceTreeInit theSourceTreeInit;
// We'll use these to parse the XML file.
XalanSourceTreeParserLiaison theLiaison(theDOMSupport);
// Hook the two together...
theDOMSupport.setParserLiaison(&theLiaison);
const XalanDOMString theFileName(filename);
// Create an input source that represents a local file...
const LocalFileInputSource theInputSource(theFileName.c_str());
// Parse the document...
xalan_document = theLiaison.parseXMLStream(theInputSource);
assert(xalan_document != 0);
return 1;
}
int MyClass::EvaluateXPathExpression (unsigned short *xpath) {
assert(xalan_document != 0);
XalanDocumentPrefixResolver thePrefixResolver(xalan_document);
XPathEvaluator theEvaluator;
// OK, let's find the context node...
XalanNode* const theContextNode = theEvaluator.selectSingleNode(
theDOMSupport,
xalan_document,
XalanDOMString("/").c_str(),
thePrefixResolver);
if (theContextNode == 0) {
wprintf (L"No nodes matched the location path");
return TAU_FAILURE;
}
else {
// OK, let's evaluate the expression...
const XObjectPtr theResult( theEvaluator.evaluate(
theDOMSupport,
theContextNode,
XalanDOMString(xpath).c_str(),
thePrefixResolver));
assert(theResult.null() == false);
cout<<theResult->str();
return 1;
}
}
I have these
xalanc_1_10::XalanDocument* xalan_document;
xalanc_1_10::XalanSourceTreeDOMSupport theDOMSupport;
as private members of my class.
Can you tell me where am I going wrong?
I couldn't make out things very well from the documentation available.
I also tried initializing XalanSourceTreeInit in a main function
called before these two but it doesn't help.
Thanks in advance,
Smeeta