Joerg,
Thanks for the pointer. I just realized that I had been doing pretty much what you wrote here. I kept getting an exception which I couldn't really understand, which was why I asked to see if my bearings were right. It seems like I was doing the right thing already. Well, that said, I'm still getting an exception, maybe you or David can help again :-).
Exception: EXC_BAD_ACCESS (0x0001) Codes: KERN_INVALID_ADDRESS (0x0001) at 0x01a37fa8
Thread 0 Crashed:
#0 0x3505ff0c in xalanc_1_5::XercesElementWrapper::getNamespaceURI() const (XercesElementWrapper.cpp:289)
#1 0x3509e154 in xalanc_1_5::XPath::NodeTester::matchLocalName(xalanc_1_5::XalanNode const&) const (XPath.cpp:5288)
#2 0x3509dcd8 in xalanc_1_5::XPath::NodeTester::testElementNCName(xalanc_1_5::XalanNode const&, xalanc_1_5::XalanNode::NodeType) const (XPath.cpp:5160)
#3 0x35289678 in xalanc_1_5::XPath::NodeTester::operator()(xalanc_1_5::XalanNode const&, xalanc_1_5::XalanNode::NodeType) const (XPath.cpp:2198)
#4 0x3509a8c0 in xalanc_1_5::XPath::findChildren(xalanc_1_5::XPathExecutionContext&, xalanc_1_5::XalanNode*, int, int, xalanc_1_5::MutableNodeRefList&) const (XPath.cpp:3754)
#5 0x350984d4 in xalanc_1_5::XPath::step(xalanc_1_5::XPathExecutionContext&, xalanc_1_5::XalanNode*, int, xalanc_1_5::MutableNodeRefList&) const (XPath.cpp:2863)
#6 0x35288d50 in xalanc_1_5::XPath::locationPath(xalanc_1_5::XalanNode*, int, xalanc_1_5::XPathExecutionContext&, xalanc_1_5::MutableNodeRefList&) const (XPath.cpp:1112)
#7 0x3509677c in xalanc_1_5::XPath::locationPath(xalanc_1_5::XalanNode*, int, xalanc_1_5::XPathExecutionContext&) const (XPath.cpp:2374)
#8 0x35090bbc in xalanc_1_5::XPath::executeMore(xalanc_1_5::XalanNode*, int, xalanc_1_5::XPathExecutionContext&) const (XPath.cpp:391)
#9 0x350906c0 in xalanc_1_5::XPath::executeMore(xalanc_1_5::XalanNode*, int, xalanc_1_5::XPathExecutionContext&) const (XPath.cpp:303)
#10 0x3508ff38 in xalanc_1_5::XPath::execute(xalanc_1_5::XalanNode*, xalanc_1_5::PrefixResolver const&, xalanc_1_5::XPathExecutionContext&) const (XPath.cpp:167)
#11 0x350a169c in xalanc_1_5::XPathEvaluator::evaluate(xalanc_1_5::DOMSupport&, xalanc_1_5::XalanNode*, xalanc_1_5::XPath const&, xalanc_1_5::PrefixResolver const&, xalanc_1_5::XPathEnvSupport&) (XPathEvaluator.cpp:481)
#12 0x350a1514 in xalanc_1_5::XPathEvaluator::evaluate(xalanc_1_5::DOMSupport&, xalanc_1_5::XalanNode*, unsigned short const*, xalanc_1_5::PrefixResolver const&, xalanc_1_5::XPathEnvSupport&) (XPathEvaluator.cpp:448)
#13 0x350a0d58 in xalanc_1_5::XPathEvaluator::evaluate(xalanc_1_5::DOMSupport&, xalanc_1_5::XalanNode*, unsigned short const*, xalanc_1_5::XalanElement const*) (XPathEvaluator.cpp:296)
#14 0x350a05cc in xalanc_1_5::XPathEvaluator::selectSingleNode(xalanc_1_5::DOMSupport&, xalanc_1_5::XalanNode*, unsigned short const*, xalanc_1_5::XalanElement const*) (XPathEvaluator.cpp:141)
Environment:
Mac OS X 10.2.6
gcc - 3.1
Xerces 2.2 compiled with -w -O0 -DXML_USE_INMEM_MESSAGELOADER -DXML_USE_MACOS_UNICODECONVERTER -DXML_USE_NETACCESSOR_URLACCESSCF
Xalan 1.5 compiled with -w --O0 DXALAN_USE_XERCES_LOCAL_CODEPAGE_TRANSCODERS -DXALAN_STRICT_ANSI_HEADERS
Both build as a "framework" (in Mac's sense, similar to dynamic library).
I noticed that it always fails with the same exception and here's what I try to do in gdb:
(gdb) p m_xercesNode
warning: can't find class named `xalanc_1_5::XercesElementWrapper', as given by C++ RTTI
$4 = (const DOMElementType * const) 0x1a77fa8
(gdb) p *m_xercesNode
warning: can't find class named `xalanc_1_5::XercesElementWrapper', as given by C++ RTTI
Cannot access memory at address 0x1a77fa8
My C++ has been a bit rusty as I'm been doing Objective-C and Java, how can I figure out what's wrong?
Note that I have also tested with the Xalan-CVS + Xerces 2.3 and I still get an exception (although I got to admit that I can't remember if it is the same exception).
Thanks, Han Ming
On Monday, July 7, 2003, at 03:03 AM, [EMAIL PROTECTED] wrote:
Hi,
having received competent help from the community, maybe I can be of help too.
We have the same scenario and use Xalan-C mainly for its XPath capabilities.
We do something like this:
void select(xercesc::DOMNode * &node,
const std::string &xpath, // XPath expression evaluating to a node set
xercesc::DOMDocument &document) {
XercesDOMSupport dom_support; XercesParserLiaison parser_liaison;
XalanDocument *xalan_document = parser_liaison.createDocument(&document, false, true);
XalanNode * root_context_node = xalan_document;
XalanElement *namespace_node = xalan_document->getDocumentElement();
const XalanDOMString expression(xpath.c_str());
DOMNode *target= 0;
XPathEvaluator evaluator;
const XalanNode* found = evaluator.selectSingleNode( dom_support, root_context_node, expression.c_str(), namespace_node);
if (found) {
XercesDocumentWrapper *xerces_document_wrapper = parser_liaison.mapDocumentToWrapper(xalan_document);
DOMNode const *const_target = xerces_document_wrapper->mapNode(node);
target = const_cast<DOMNode *>(const_target);
}
node = target; }
Now your calling code can do with the passed DOMNode pointer what it wants, maybe modify it.
Just observe the remark from David Bertoni if you keep your XercesParserLiaison
and XercesDocumentWrapper outside the function performing the selectSingleNode-call:
If you're going to use XercesDocumentWrapper, make sure you always re-build
the wrapper after you've made modifications to the document, and make sure
you pass true for the buildWrapper parameter.
By the way, this works also for XPathEvaluator::selectNodeList() to get a complete node set and for XPathEvaluator::evaluate() if you're interested in non-node set XPath types such as string, number and boolean.
Hope this helps.
Bye
Joerg
[EMAIL PROTECTED]
