【发布时间】:2015-11-25 08:33:55
【问题描述】:
我使用 Xercesc 库来解析 XML,但这个库只能执行简单的 xPath。我已经编写了自己的方法来执行 xPath,如下所示:
myProj/Parameters/Parameter[@Name="SomeName"]/Values/@DefaultValue
但是当我运行我的程序时,我有“myProj.exe 已触发断点”,并且在调试时看到“_CrtIsValidHeapPointer”方法定义。当我避免使用我的方法时 - 一切都很好,所以我的代码一定有问题,但我不知道是什么。
string executeXPath(const char *A_xmlFile, string xPathh, shared_ptr<vector<string>> sectionSqlVector)
{
scoped_ptr<XercesDOMParser> parser(new XercesDOMParser());
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); // optional
scoped_ptr<ErrorHandler> errHandler((ErrorHandler*) new HandlerBase());
parser->setErrorHandler(errHandler.get());
parser->parse(A_xmlFile);
const XMLCh* xPath = XMLString::transcode(xPathh.c_str());
int pos = XMLString::indexOf(xPath,'@');
int pos2 = XMLString::indexOf(xPath,('='));
XMLCh* attrName = new XMLCh;
XMLString::subString(attrName,xPath,pos+1,pos2);
pos = XMLString::indexOf(xPath,'@', pos+1);
XMLCh* attr2name = new XMLCh;
XMLString::subString(attr2name, xPath, pos+1, XMLString::stringLen(xPath));
pos = XMLString::indexOf(xPath,'"');
XMLCh* attribute = new XMLCh;
XMLString::subString(attribute, xPath, pos+1, XMLString::indexOf(xPath,'"',pos+1));
DOMNode* docRootNode;
DOMDocument* doc;
doc = parser->getDocument();
docRootNode = doc->getDocumentElement();
DOMElement* elementRoot = doc->getDocumentElement();
DOMNodeList* nodeList = elementRoot->getElementsByTagName(L"Parameter");
XMLSize_t d = nodeList->getLength();
string valuee = "";
for (XMLSize_t i = 0; i < d; i++)
{
DOMElement* tempElement = (DOMElement*)nodeList->item(i);
if (tempElement->hasAttribute(attrName))
{
const XMLCh* tempChar = tempElement->getAttribute(attrName);
if (XMLString::equals(attribute,tempChar))
{
DOMNodeList* tempList2 = tempElement->getElementsByTagName(L"Values");
DOMElement* tempElement2 = (DOMElement*)tempList2->item(0);
const XMLCh* defValue = tempElement2->getAttribute(attr2name);
valuee = XMLString::transcode(defValue);
tempElement2->release();
}
}
tempElement->release();
}
doc->release();
elementRoot->release();
docRootNode->release();
XMLString::release(&attr2name);
XMLString::release(&attrName);
XMLString::release(&attribute);
return valuee;
}
【问题讨论】:
-
对不起,我帮不了你。我也不知道。但是你正在实施的是非常有价值的。如果您可以发布最终的工作代码,那就太好了。其他人可以从中受益。
-
我自己解决了这个问题,而且这个方法效果很好——正如我所料。问题在于内存分配。但是这个方法只执行上面提到的 XPath。你认为有人会使用它并认为它有价值吗?如果是这样,我应该在哪里发布我的代码?这里?在评论中?抱歉,我没有分享自己的代码的经验;)
-
是的,XPath 确实存在问题,您的代码可以让人们了解如何实现您自己的自定义 XPath 解决方案。最好的方法是在答案中发布您的解决方案。但是,如果您没有权利,那么您可以编辑您的问题并在其中发布解决方案。